2009-08-21 8 views
5

का उपयोग कर मैं वर्तमान में एक सरल भेजूँ और मेरे नेटवर्क पर अन्य टीसीपी आधारित डिवाइस के लिए कुछ कच्चे आंकड़ों के प्राप्त करने के लिए ब्लैकबेरी पर कोई ऐप लिख रहा हूँ। मुझे ब्लैकबेरी सिम्युलेटर डब्ल्यू/एक एमडीएस सिम्युलेटर में चल रहा है और मेरी कंपनी के एमडीएस सर्वर से बात करने वाले एक भौतिक फोन का उपयोग कर एक ही समस्या है। ध्यान दें कि यह समस्या तब होती है जब वाईफ़ाई का उपयोग सीधे और एमडीएस के माध्यम से नहीं किया जाता है।जारी करना एक ब्लैकबेरी के साथ SocketConnection का उपयोग कर एमडीएस

समस्या InputStream पर उपलब्ध() फ़ंक्शन कि शून्य जब तक मैंने पढ़ा कॉल() पहला है। अगर मैं पहले पढ़ता हूं (जानना कि कुछ डेटा उपलब्ध है .. धन्यवाद wireshark) डेटा वापस आता है, और बाद में कॉल() को इंगित करता है कि कौन सा डेटा छोड़ा गया है जिसे मैंने नहीं पढ़ा। समस्या यह है कि मुझे हमेशा गारंटी नहीं दी जाएगी कि डेटा वहां होगा और इसलिए मैं ब्लॉक कर सकता हूं। क्या किसी को इसके बारे में पता है, और क्या यह एक समस्या या कुछ है जो डिजाइन द्वारा है?

अगर पढ़ने() विधि (रों) उन्हें उपलब्ध से अलग कॉल करने से पहले किसी को भी अवरुद्ध कर देगा एक तरह से के बारे में पता परीक्षण करने के लिए है?

 
SocketConnection s = (SocketConnection)Connector.open("socket://1.2.3.4:port;deviceside=false", Connector.READ_WRITE); 

OutputStream o = ((StreamConnection)s).openOutputStream(); 
InputStream i = ((StreamConnection)s).openInputStream(); 

o.write("hello"); 
Thread.sleep(sometime); 
if (i.available() > 0) { 
    byte[] data = new data[10]; 
    int bytesRead = i.read(data); 
    System.out.println("Read [" + new String(data) + "] (bytes = " + bytesRead + ")"); 
} 

मैं इस काम करने के लिए करता है, तो सशर्त बाहर टिप्पणी करने के लिए है:

यहाँ मैं क्या कर रहा हूँ मूल रूप से है।

+0

यह ब्लॉक हो सकता है - लेकिन क्या यह समस्या है यदि आपका नेटवर्किंग अलग थ्रेड पर है? – lilbyrdie

+0

मुझे लगता है कि मैंने दस्तावेज़ों में कहीं कहीं पढ़ा है कि यह निर्दिष्ट व्यवहार यह है कि उपलब्ध है। जैसा कि libyrdie कहते हैं धागे आपके दोस्त हैं। मैं पढ़ने के लिए एक थ्रेड स्पिन करता हूं और इसे ब्लॉक करने देता हूं। – Richard

+0

आम तौर पर यह ठीक होगा।समस्या यह है कि हम यह पता लगाने की कोशिश कर रहे हैं कि डिवाइस मौजूद है या नहीं, यह देखकर सही तरीके से परिचालन कर रहा है कि यह एक विशिष्ट टीसीपी पिंग का जवाब देता है या नहीं। बस ब्लॉक को पढ़ने की इजाजत देने से ज्यादा मदद नहीं मिलती है। हमें मूल रूप से धागे को फेंकना होता है और फिर एक्स सेकंड के बाद इसे मारना पड़ता है। यह बहुत कठिन नहीं है, लेकिन आदर्श नहीं है। एमडीएस कनेक्शन के बजाय प्रत्यक्ष वाईफाई का उपयोग करते समय यह काम नहीं करता है, तो यह निराशाजनक नहीं होगा। यदि आप प्रत्यक्ष वाईफाई का उपयोग करते हैं, तो बहुत अच्छा काम करता है। – borq

उत्तर

0

जैसा कि मैंने ऊपर एक टिप्पणी में संकेत दिया है, मैं निर्धारित करने के लिए एक उपकरण है मैं से कनेक्ट कर रहा हूँ वहाँ नहीं है एक तरह से की जरूरत है, और मैं अपनी 'पिंग' किसी भी डेटा लौटाता है यदि देखकर करते हैं। यदि डिवाइस नहीं है तो यह अवरुद्ध होगा। मैं उस व्यवहार पर भरोसा नहीं कर सकता। एक और मुद्दा जो इसे हल करते समय क्रिप्ट होता है वह है कि यदि आप वापस चाहते हैं तो डेटा से बड़ा बफर प्रदान करते हैं तो आरआईएम इनपुटस्ट्रीम क्लास ब्लॉक के पढ़ने (...) विधियां। लेकिन मुझे कैसे पता होना चाहिए कि उपलब्ध होने पर कितना डेटा है() 0 देता है? बाइट-बाय-बाइट पढ़ना ऐसा करने का एकमात्र तरीका है, लेकिन यदि कोई डेटा नहीं है तो यह अभी भी अवरुद्ध है।

इसका समाधान करने के लिए मैं 1 जवाब के विषय का पालन किया है, लेकिन मैं अपने आप ही धागे पर इस विधि रख दिया और यह एक अलग बाइट बफर को लिखने के लिए किया था। मैंने एक कक्षा बनाई जो इनपुटस्ट्रीम बढ़ाया और लागू() लागू किया और पढ़ें (...)। उपलब्ध रिटर्न बाइट बफर में कितने बाइट हैं, और केवल पढ़ने के लिए बफर में बहुत कुछ है या फिर कॉलर अनुरोध, जो भी कम है, वापस देता है।

यह सेटअप मुझे इनपुट इनपुट इंटरफ़ेस का उपयोग करने देता है, लेकिन दृश्यों के पीछे यह केवल एक सतत चलने वाला पाठक धागा है जो कनेक्शन छोड़ने तक जीवित है। उस समय पढ़ा गया, अगर अवरुद्ध हो, तो कनेक्शन बंद होने का संकेत देने के लिए अपवाद फेंक देगा। यह व्यवहार ठीक है क्योंकि इसे आसानी से संभाला जा सकता है।

इस मुद्दे के साथ मदद करने वाले सभी के लिए धन्यवाद। आपके विचार समाधान की ओर बढ़ने में मदद करते हैं।

3

इनपुटस्ट्रीम.अनावश्यक() विधि का सामान्य अनुबंध यह है कि "इस इनपुट स्ट्रीम के लिए किसी विधि के अगले कॉलर द्वारा अवरुद्ध किए बिना इस इनपुट स्ट्रीम से बाइट्स की संख्या को वापस (या छोड़ दिया जा सकता है) । " इसलिए अधिकांश कार्यान्वयन में, यह गारंटी नहीं है कि यह पढ़ने वाली धारा की सामग्री लंबाई वापस कर देगा। इसलिए यह नीचे दिए तरीक़े

byte[] readFromStream(InputStream is) throws IOException 
{ 
    byte[] data = new byte[4096]; 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    DataOutputStream dos = new DataOutputStream(baos); 

    int count = is.read(data, 0, data.length); 
    while (count != -1) 
    { 
     dos.write(data, 0, count); 
     count = is.read(data, 0, data.length); 
    } 

    data = baos.toByteArray(); 

    return data; 
} 

आप readFromStream() विधि कॉल और बाइट [] लौटे पाने में इसे पढ़ने के लिए बेहतर है।

+0

बिल्कुल। एंड्रॉइड पर ही। – yanchenko