मेरे पास एक साधारण ग्राहक/सर्वर ऐप है। सर्वर स्थापित किया गया है ताकि यदि एन सेकंड के भीतर कोई डेटा नहीं आता है तो टाइमआउट होता है और सॉकेट कनेक्शन बंद हो जाता है। मैं इसे Socket.setSoTimeout() के माध्यम से करता हूं। क्लाइंट लटकता है तो यह सब ठीक काम करता है। यदि ग्राहक मर जाते हैं, हालांकि (उदा। मैं इसे Ctrl-C से मारता हूं), तो readLine() कभी भी कभी नहीं निकलता है।जावा में, एक बंद सॉकेट कनेक्शन पर readLine() ब्लॉक क्यों करता है?
यहाँ, सर्वर कोड है कि यदि एक फर्क नहीं पड़ता:
public void run()
{
PrintWriter out = null;
BufferedReader in = null;
try {
sock.setSoTimeout(10000);
out = new PrintWriter(sock.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
String input;
while ((input = in.readLine()) != null) {
मैं ग्राहक में एक संकेत हैंडलर में डाल सर्वर से एक Abend संदेश पर भेजने के लिए कोशिश की है लेकिन यह है कि काम नहीं कर रहा (मुझे लगता है ABEND भेजा जाने से पहले सॉकेट बंद हो जाता है, लेकिन मैंने इसे समझने की कोशिश करने में किसी भी समय वास्तव में खर्च नहीं किया है)।
क्या समय-समय पर जागने का तरीका है और यह देखने के लिए सॉकेट स्थिति की जांच करें कि यह बंद है या नहीं? या (बेहतर अभी तक) पढ़ा नहीं है लाइन() सॉकेट बंद होने पर लटका? क्या मुझे किसी प्रकार के अनबफर पाठक का उपयोग करना चाहिए? क्या एक unbuffered पाठक एक readLine जैसी तंत्र का समर्थन कर रहा है?
मैं लिनक्स पर जावा 6 का उपयोग कर रहा हूं।
संपादित करें: मैं एक निष्क्रिय अवधि के दौरान खुद को ग्राहक को मार रहा हूं; इस बिंदु पर सभी डेटा भेजा और प्राप्त किया गया है। मैंने सत्यापित किया है (पीएस के माध्यम से) कि क्लाइंट प्रोग्राम अब नहीं चल रहा है; जावा प्रक्रिया वास्तव में मारे गए हैं। नेटस्टैट का उपयोग करके मैं देख सकता हूं कि दोनों सिरों पर सॉकेट बंद है, फिर भी पढ़ा गया है() अभी भी लटकता है।
देखें http://stackoverflow.com/questions/1577719/java-sockets-bufferedreader-and-readline-hang - शायद सीआर भेजा गया था और पढ़ने के बाद क्लाइंट की मौत हो गई() कभी भी एलएफ का उपभोग नहीं किया गया, इस प्रकार यह इसके लिए तैयार है हमेशा के लिए – mantrid
मैं एक निष्क्रिय अवधि के दौरान खुद को क्लाइंट की हत्या कर रहा हूं; इस बिंदु पर सभी डेटा भेजा और प्राप्त किया गया है। –
किस प्रकार की सॉकेट? टीसीपी या यूडीपी? – ecbrodie