2008-09-25 11 views
65

मैं बिल्कुल निम्न त्रुटि क्या मतलब करने के लिए एक पर्याप्त जवाब खोजने के लिए सक्षम नहीं किया गया:java.net.SocketException: सॉफ्टवेयर की वजह से कनेक्शन बीच में बंद करें: recv में विफल रहा है

java.net.SocketException: Software caused connection abort: recv failed

नोट्स:

  • यह त्रुटि कम और अप्रत्याशित है; हालांकि इस त्रुटि को प्राप्त करने का मतलब है कि यूआरआई के लिए सभी भविष्य के अनुरोध भी असफल हो जाएंगे।
  • एकमात्र समाधान जो काम करता है (भी, कभी-कभी कभी) टॉमकैट और/या वास्तविक मशीन (इस मामले में विंडोज) को रीबूट करना है।
  • यूआरआई निश्चित रूप से उपलब्ध है (ब्राउज़र को लाने के लिए ब्राउज़र से पूछकर पुष्टि की गई है)।

प्रासंगिक कोड:

BufferedReader reader; 
try { 
URL url = new URL(URI); 
reader = new BufferedReader(new InputStreamReader(url.openStream()))); 
} catch(MalformedURLException e) { 
throw new IOException("Expecting a well-formed URL: " + e); 
}//end try: Have a stream 

String buffer; 
StringBuilder result = new StringBuilder(); 
while(null != (buffer = reader.readLine())) { 
result.append(buffer); 
}//end while: Got the contents. 
reader.close(); 
+3

अरे वहाँ। आपने उत्तर को सही के रूप में चिह्नित किया - आपको कुछ याद आती है जो आपको कुछ स्नीफिंग करके मिली है? इस समस्या ने मुझे मिल गया है। (मेरा प्रश्न देखें http://stackoverflow.com/questions/6772215/java-net-socketexception-software-caused-connection-abort-recv-failed-with-jav) –

+1

मुझे यह समस्या भी है। एकमात्र समाधान पूरी मशीन को रीबूट करना है। किसी का पूरा जवाब है? –

+0

@ केविनवॉन्ग समाधान नेटवर्क को ठीक करना है। – EJP

उत्तर

21

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

3

आप http डेटा तक पहुँचने रहे हैं? क्या आप मानक पुस्तकालय की बजाय HttpClient लाइब्रेरी का उपयोग कर सकते हैं? लाइब्रेरी में अधिक विकल्प हैं और बेहतर त्रुटि संदेश प्रदान करेंगे।

http://hc.apache.org/httpclient-3.x/

4

केवल समय मैंने देखा है कुछ इस तरह हो सकता है जब मैं एक बुरे कनेक्शन होता है या जब कोई सॉकेट है कि मैं एक अलग धागा संदर्भ से उपयोग कर रहा हूँ बंद हो रहा है।

1

यह समय-समय पर होगा को जोड़ने 'autoReconnect = सच' की कोशिश या तो जब एक कनेक्शन का समय समाप्त या जब एक दूरस्थ होस्ट उनके कनेक्शन (बंद आवेदन, कंप्यूटर बंद, आदि) समाप्त हो जाता है । आप अपने संचार प्रोटोकॉल के माध्यम से अपने एप्लिकेशन में डिस्कनेक्शन को संभालने और सत्र को साफ़ करने के लिए shutdownInput और shutdownOutput पर कॉल करके इसे से बच सकते हैं।

1

देखें कि आपके पास http पोर्ट पर कोई अन्य सेवा या प्रोग्राम चल रहा है या नहीं। यह तब हुआ जब मैंने बंदरगाह का उपयोग करने की कोशिश की और इसे किसी अन्य कार्यक्रम द्वारा लिया गया। यह भी अगर आपके TLS क्लाइंट सर्वर क्लाइंट प्रमाणीकरण की आवश्यकता करने के लिए कॉन्फ़िगर द्वारा प्रमाणित नहीं किया जा सका है होता है सर्वर

0

आप Netbeans उपयोग कर रहे हैं बिलाव प्रबंधन करने के लिए, उपकरण में HTTP मॉनिटर निष्क्रिय करने के लिए प्रयास करें।

+0

इसे आजमाएं क्यों? – EJP

17

-

+0

नहीं, ऐसा नहीं है। इससे सर्वर को टीएलएस 'close_notify' के साथ कनेक्टन को ठीक से बंद कर देता है। बिल्कुल रीसेट नहीं है, या सबसे अच्छा 'सहकर्मी द्वारा कनेक्शन रीसेट' पर। – EJP

+0

प्रमाणीकरण विफल होने पर कुछ एपीआई के साथ ऐसा हुआ। तो धन्यवाद @ desbocages। – Eddy

+0

यह मेरे अपाचे सेटअप – Atuos

0

मुझे भी यह समस्या थी। मेरे समाधान किया गया था:

sc.setSoLinger(true, 10); 

किसी वेबसाइट से कॉपी ->setSoLinger() विधि का उपयोग करके आप स्पष्ट रूप से के लिए डेटा या पढ़ने के लिए भेजने के लिए और अधिक समय दे रही देरी सेट कर सकते हैं एक रीसेट भेजे जाने से पहले,।

शायद यह सभी लोगों के लिए लेकिन कुछ लोगों के लिए जवाब नहीं है।

+1

यह सब बकवास है। SO_LINGER ऐसी कोई काम नहीं करता है। यह नियंत्रित करता है कि अगर कितना समय 'बंद() 'ब्लॉक है, तो बिल्कुल। इसका रीसेट के समय से कोई लेना देना नहीं है। और 'वेबसाइट से कॉपी' उद्धरण का एक उचित रूप नहीं है। आपको लिंक प्रदान करना चाहिए ताकि हम देख सकें कि यह वास्तव में क्या कहता है, और यदि आवश्यक हो तो भी प्रतिकूल टिप्पणी करें। मुझे पता है [जहां से आप इसे प्राप्त कर चुके हैं] (http://www.davidreilly.com/java/java_network_programming/), और यह ग्रेड ए ड्रवेल शुरू से ही खत्म हो गया है। मैंने उसे लगभग 15 साल पहले सुधारों का एक भार भेजा: उसने एक टैंट्रम फेंक दिया और तब से इसे अपडेट नहीं किया है। – EJP

5

यह त्रुटि तब होती है जब कनेक्शन अचानक बंद हो जाता है (जब एक टीसीपी कनेक्शन रीसेट होता है जबकि प्रेषक बफर में अभी भी डेटा होता है)। यह स्थिति बहुत अधिक आम है 'सहकर्मी द्वारा कनेक्शन रीसेट'। यह इंटरनेट पर कनेक्ट होने पर स्पोरैडिक रूप से हो सकता है, लेकिन समय सारिणी सही होने पर भी व्यवस्थित रूप से हो सकता है (उदाहरण के लिए लोकलहोस्ट पर रख-रखाव कनेक्शन के साथ)।

एक HTTP क्लाइंट को कनेक्शन को फिर से खोलना चाहिए और अनुरोध को पुनः प्रयास करना चाहिए। यह समझना महत्वपूर्ण है कि जब इस स्थिति में कोई कनेक्शन होता है, तो इसे बंद करने के अलावा इसके अलावा कोई रास्ता नहीं है। भेजने या प्राप्त करने का कोई भी प्रयास एक ही त्रुटि उत्पन्न करेगा।

URL.open() का उपयोग न करें, अपाचे-कॉमन्स HttpClient का उपयोग करें जिसमें एक पुन: प्रयास तंत्र, कनेक्शन पूलिंग, जीवित रहने और कई अन्य सुविधाएं हैं।

नमूना उपयोग:

HttpClient httpClient = HttpClients.custom() 
      .setConnectionTimeToLive(20, TimeUnit.SECONDS) 
      .setMaxConnTotal(400).setMaxConnPerRoute(400) 
      .setDefaultRequestConfig(RequestConfig.custom() 
        .setSocketTimeout(30000).setConnectTimeout(5000).build()) 
      .setRetryHandler(new DefaultHttpRequestRetryHandler(5, true)) 
      .build(); 
// the httpClient should be re-used because it is pooled and thread-safe. 

HttpGet request = new HttpGet(uri); 
HttpResponse response = httpClient.execute(request); 
reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 
// handle response ... 
+0

नहीं, ऐसा नहीं है। इससे 'सहकर्मी द्वारा कनेक्शन रीसेट' का कारण बनता है। ओपी की त्रुटि प्रोग्रामिंग के कारण नहीं है। – EJP

+0

हां यह करता है। मेरा सुझाव है कि आप -1 देने से पहले कुछ शोध करें। हमने वास्तव में किया था। 'कनेक्शन रीसेट' टीसीपी आरएसटी पैकेट के कारण होता है, लेकिन जब टीसीपी आरएसटी प्राप्त होता है, तब भी प्रेषण बफर में डेटा होता है, तो आवेदन से बाद में 'आरईआरवी() 'एक' WSAECONNABORTED' त्रुटि का कारण बनता है जो अनुवाद करता है प्रश्न में अपवाद मुझे आश्चर्य है कि इस अपवाद के लिए * आपका * स्पष्टीकरण क्या है। "नेटवर्क को ठीक करें" आप कहते हैं - मैं इसे स्थानीयहोस्ट पर कोड की कुछ पंक्तियों के साथ पुन: पेश कर सकता हूं। – rustyx

+0

आप अभी भी 'कनेक्शन रीसेट' के साथ-साथ सॉफ़्टवेयर के कारण कनेक्शन निरस्त कर रहे हैं। वे दो अलग-अलग स्थितियां हैं। – EJP

संबंधित मुद्दे