मुझे सॉकेट में लिखने के दौरान बहुत अजीब व्यवहार है। अपने मोबाइल ग्राहक में मैं एक सॉकेट जो आरंभ नहीं हो जाता उपयोग कर रहा हूँ इस प्रकार है:आउटपुटस्ट्रीम.write() सफल लेकिन डेटा वितरित नहीं किया गया है
private void initSocket()
{
socket = new Socket();
socket.connect(new InetSocketAddress(host, port));
os = new DataOutputStream(socket.getOutputStream());
is = new DataInputStream(socket.getInputStream());
}
तो समय-समय पर (हर 60 सेकंड) मैंने पढ़ा है और इस सॉकेट के लिए कुछ डेटा लिखने (कोड यहाँ सरलीकृत एक छोटा सा है) :
if(!isSocketInitialized())
{
initSocket();
}
byte[] msg = getMessage();
os.write(msg);
os.flush();
int bytesAvailable = is.available();
if(bytesAvailable>0)
{
byte[] inputBuffer = new byte[bytesAvailable];
int numRead = is.read(inputBuffer, 0, bytesAvailable);
processServerReply(inputBuffer, numRead);
}
और यह काम करता है। लेकिन ... कभी-कभी (बहुत बार, शायद प्रति दिन 1 या 2 बार) मेरे सर्वर को डेटा प्राप्त नहीं होता है। मेरा ग्राहक लॉग इस तरह दिखता है:
Written A
Written B
Written C
Written D
Written E
और इसी तरह। लेकिन सर्वर साइड पर ऐसा लगता है कि:
Received A
Received E
बी, सी, डी डेटा रिकॉर्ड, प्राप्त नहीं कर रहे थे तथ्य के बावजूद है कि ग्राहक पक्ष पर यह लग रहा है सभी डेटा की तरह किसी भी अपवाद के बिना भेजा गया था!
इस तरह के अंतराल छोटे (2-3 मिनट) हो सकते हैं जो बहुत खराब नहीं होते हैं, लेकिन कभी-कभी वे बहुत बड़े (1-2 घंटे = 60-120 चक्र) हो सकते हैं और यह वास्तव में मेरे ग्राहकों के लिए एक समस्या है।
मुझे वास्तव में कोई जानकारी नहीं है कि क्या गलत हो सकता है। डेटा क्लाइंट द्वारा भेजा जाता प्रतीत होता है, लेकिन यह सर्वर की तरफ कभी नहीं आता है। मैंने इसे प्रॉक्सी के साथ भी चेक किया है।
मेरे पास केवल लॉग हैं और मैं इस समस्या को पुन: उत्पन्न नहीं कर सकता (लेकिन यह मेरे ग्राहक के साथ हर बार एक बार होता है) और लॉग में कभी-कभी मुझे लगता है कि कनेक्शन अपवाद के साथ टूट गया है "प्रेषण विफल: ECONNRESET (हमउम्र द्वारा पुनःस्थापित संबंध)"। कि कार्यक्रम सॉकेट बंद कर देता है के बाद, यह reinitializes:
// close
is.close();
os.close();
socket.close();
// reinitialize
initSocket();
और जैसा कि ऊपर वर्णित फिर से डेटा लिखने के लिए कोशिश करता है। फिर मुझे समस्या दिखाई देती है: कनेक्शन स्थापित, सफल लेखन, लेकिन सर्वर पर कोई डेटा नहीं पहुंचा!
हो सकता है कि यह ECONNRESET के साथ कुछ करने के लिए हो, लेकिन मैं इसका उल्लेख करना चाहता हूं क्योंकि यह महत्वपूर्ण है।
मैं किसी भी विचार और सुझावों के लिए बहुत आभारी हूं।
पीएस शायद यह कुछ भूमिका निभाता है: क्लाइंट कोड एक एंड्रॉइड मोबाइल डिवाइस पर चलता है जो चल रहा है (यह एक कार में है)। जीपीआरएस के माध्यम से इंटरनेट कनेक्शन स्थापित किया गया है।
यूपीडी: मैं इसे पुन: उत्पन्न कर सकता हूं! कम से कम आंशिक रूप से (क्लाइंट ए, बी, सी, डी, ई भेजता है और सर्वर केवल ए प्राप्त करता है)। यह हर बार अगर ऐसा होता:
कनेक्शन स्थापित हो जाने, ग्राहक रीड और राईट -> ठीक
कनेक्शन खो जाता है (मैं अपने WLAN रूटर :) बंद कर देते हैं), मैं IOException बन गया है, मैं धाराओं और सॉकेट को बंद करता हूं -> ठीक
मैं अपना राउटर चालू करता हूं, कनेक्शन वापस आ गया है, मैं सॉकेट को फिर से शुरू करता हूं, प्रोग्राम अपवादों के बिना लिखता है(), लेकिन सर्वर पर कोई डेटा नहीं आता है ।
कनेक्शन वापस फिर से उपलब्ध है BTW के बाद से() 0.
एक चीज जो मदद कर सकती है वह एक सर्वर होगा जो डिवाइस के साथ सिंक करने का प्रयास कर सकता है। यदि यह पहली बार डेटा को याद करता है, तो यह हमेशा कोशिश कर सकता है - इस पर निर्भर करता है कि आप कितनी बार डेटा के लिए मतदान करते हैं। – Max
@ मैक्स, यकीन है, आप सही हैं। लेकिन सर्वर बंद सॉफ्टवेयर है और मैं प्रोटोकॉल नहीं बदल सकता। – Valelik
क्या आप 'ByteArrayOutputStream' का उपयोग नहीं कर सके? कुछ [इस तरह] (http://stackoverflow.com/a/2984550/1134705) – jnthnjns