ما الذي يسبب java.net.socketexception: إعادة تعيين الاتصال؟ [مكرر

StackOverflow https://stackoverflow.com/questions/585599

سؤال

هذا السؤال لديه بالفعل إجابة هنا:

نرى متكرر ولكن متقطع java.net.SocketException: Connection reset أخطاء في سجلاتنا. نحن غير متأكد من أين Connection reset الخطأ يأتي بالفعل من، وكيفية الذهاب حول تصحيح الأخطاء.

يبدو أن المشكلة لا علاقة لها بالرسائل التي نحاول إرسالها. لاحظ أن الرسالة هي ليس connection reset by peer.

أي اقتراحات حول الأسباب النموذجية لهذه الاستثناء قد تكون، وكيف قد نستمر؟

هنا تتبع مكدس التمثيل (com.companyname.mtix.sms هو مكوننا):

 java.net.socketexception: إعادة تعيين الاتصال في java.net.sockettinputstream.Read (SocketEnputStream.java:168) في java.io.bufferedinputstream.fill (bufferedinputstream.java:218) في java.io.bufferedinputstream.read (bufferedinputstream.java : 235) org.apache.commons.httpclient.httpparser.readrawline (httpperser.java:77) org.apache.commons.httpclient.httpclient.httpparser.readline (httpparser.java:105) org.apache.commons.httpclient. httpconnection.readline (httpconnection.java:11115) org.apache.commons.httpclient.httpmethodbase.readstatusline (httpmethodbase.java:1832) org.apache.commons.httpclient.httpmethodbase.readResponse (httpmethodbase.java:1590) في Org: 1590) .apache.commons.httpclient.httpmethodbase.execute (httpmethodbase.java:955) على org.apache.commons.httpclient.httpmethoddddderector.executewithretry (httpmethoddirector.java:397) org.apache.commons.httpclient.httpmethodddirector.executemethoddderector.executemethod (httpmetheddirector .java: 170) org.apache.commons.httpclient.httpclient.executemethod (httpclient.java:396) في org.apache.commons.httpclient.httpclient.executemethod (httpclient.java:324) at com.companyname.mtix.sms.services.impl.message.sendtextmessage.sendtextmessage (sendtextmessage.java:127) at com.companyname.mtix .sms.services.messageserviceimpl.sendtextmessage (messoryerviceimpl.java:125) at com.companyname.mtix.sms.services.mtix.messageserviceremoteimpl.sendtextmessage (spelliterviceremotexpl.java:43) في sun.reflect.generatedmethetmetcessor203.invoke (مصدر غير معروف) في sun.reflect.delegatingmethodaccessorimpl.invoke (تفويضMethodaccessorimpl.java:25) at java.lang.reflect.method.invoke (الطريقة. Java:585) org.apache.axis.providers.java.rpcprovider.invokemethod (rpcprovider.java : 397) في org.apache.axis.providers.java.rpcprovider.processmessage (rpcprovider.java:186) في org.apache.axis.providers.java.javaprovider.invoke (Javaprovider.java:323) في Org.apache. axis.strategies.invocationstrategy.visit (invocationstrategy.java:32) في org.apache.axis.simplechain.dovisiting (simplechain.java:118) org.apache.axis.simplechain.invoke (simplechain.java:83) or org.apache.axis.handlers.soap.soapservice.invoke (soapservice.java:453) في org.apache.axis.server.axisserver.invoke (axisserver.java:281) or org.apache.axis.transport.http.axisservlet.dopost (axisservlet.java:699) في javax.servlet.http.httpservlet.service (httpservlet.java:709) في Org.apache. axis.transport.http.http.axisservletbase.service (axisservletbase.java:327) في javax.servlet.http.httpservlet.service (httpservlet.java:802) at org.apache.catalina.core.applicationfiltertchain.internaldofilter (ApplicationFilterchain.java: 252) في org.apache.catalina.core.applicationfiltertchain.dofilter (Applicationfilterchain.java:173) في com.companyname.mtix.sms.http.filters.nocachefilter.dofilter (nocachefilter.java:63) org.apache.catalina .core.applicationfiltertchain.internaldofilter (ApplicationFilterChain.java:20ava: 202) في Org.apache.catalina.core.applicationfilterchain.dofilter (Applicationfilterchain.java:173) في com.companyname.mtix.sms.http.filter s.messagefilter.dofilter (messagefilter.java:53) org.apache.catalina.core.applicationfilterchain.internaldofilter (ApplicationFilterchain.java:202) في Org.apache.catalina.core.applicationfilterchain.dofilter (ApplicationFilterTchain.java: 183) في org.springframework.web.filter.requestcontextfilter.dofilterinternal (requiredcontextfilter.java:61) في org.springframework.web.filter.onceperrequestfilter.dofilter (ما يحدث (ApplicationFilterchain.java:202) في Org.apache.catalina.core.applicationfiltertchain.dofilter (ApplicationFilterChain.java:173) في Org.ajaxanywhere.aafilter.dofilter (AAFILTER.JAVA: 46) في Org.apache.catalina.core. ApplicationFilTerTchain.internaldofilter (ApplicationFilterChain.java:202) في Org.apache.catalina.core.applicationfiltertchain.dofilter (Applicationfilterchain.java:173) org.apache.catalina.core.tandardwrappervalve.invoke (StandardWrappervalve.java: 213) في Org: 213) .apache.catalina.core.sta. ndardcontextvalve.invoke (standardcontextvalve.java:178) org.apache.catalina.core.standardhostvalve.invoke (Standardhostvalve.java:126) في Org.apache.catalina.valves.errorreportvalve.invoke (ErrorReportvalve.java: 105) في Org .apache.catalina.valves.accesslogvalve.invoke (accesslogvalve.java:541) في org.apache.catalina.core.standardenginevalve.invoke (standardenginevalve.java:107) في org.apache.catalina.connector.coyoteadapter.service (coyotaDapter .java: 148) في org.apache.coyote.http11.http11processor.process (http11processor.java:869) في org.apache.coyote.http11base.http11baseprotocol $ http11connectionhandler.processconnection (http11baseprotocol.java:664) في org.apache. tomcat.util.net.pooltcpendpoint.processsocket (pooltcpendpoint.java:527) org.apache.tomcat.util.net.leaderfollowerworkerthread.runit (Leaderfollowerworkertread.java:80) في Org.apache.tomcat.util.Threads.threadpool $ Controlrunable.run (ThreadPool.java:684) في java.lang.thread.run (Thread.java: 595) 

مكوننا هو تطبيق ويب، يعمل تحت Tomcat، الذي يستدعي خدمة ويب طرف ثالث يرسل رسائل SMS، لذلك يحدث ذلك. خط الرمز الخاص بنا الذي يتم إلقاؤه من خلال السطر الأخير في مقتطف التعليمات البرمجية أدناه.

String aggregatorResponse = null;
HttpClient httpClient = prepareHttpClient( username, password );
PostMethod postMethod = preparePostMethod( textUrl );

try {
  SybaseTextMessageBuilder builder = new SybaseTextMessageBuilder();
  URL notifyUrl = buildNotificationUrl( textMessage, codeSetManager );
  String smsRequestDocument = builder.buildTextMessage( textMessage, notifyUrl );
  LOG.debug( "Sybase MT document created as: \n" + smsRequestDocument );

  postMethod.setRequestEntity( new StringRequestEntity( smsRequestDocument ) );
  LOG.debug( "commiting SMS to aggregator: " + textMessage.toString() );
  int httpStatus = httpClient.executeMethod( postMethod );
هل كانت مفيدة؟

المحلول

ينص Javadoc من أجل SocketException على أنه

ألقيت للإشارة إلى وجود خطأ في البروتوكول الأساسي مثل خطأ TCP

في حالتك، يبدو أن الاتصال قد تم إغلاقه بواسطة نهاية الخادم للاتصال. قد يكون هذا مشكلة في الطلب الذي ترسله أو مشكلة في نهايته.

للمساعدة في تصحيح الأخطاء، يمكنك إلقاء نظرة على استخدام أداة مثل Wireshark. لعرض حزم الشبكة الفعلية. أيضا، هل يوجد عميل بديل لرمز Java الخاص بك الذي يمكنك استخدامه لاختبار خدمة الويب؟ إذا نجح هذا، فقد يشير إلى وجود خطأ في رمز Java.

كما كنت تستخدم العمود المشاعتين، إلقاء نظرة على دليل تسجيل دخول عميل HTTP المشترك. وبعد سيخبرك ذلك بكيفية تسجيل الطلب على مستوى HTTP.

نصائح أخرى

هذا خطأ يحدث على جانبكم وليس الجانب الآخر. إذا قمت بإعادة تعيين الجانب الآخر الاتصال، فيجب أن تقول رسالة الاستثناء:

java.net.SocketException reset by peer

السبب هو الاتصال في الداخل HttpClient هو قديم. تحقق اتصال لا معنى ل SSL لا يحدد هذا الخطأ. الحل: تفريغ عميلك وإعادة إنشائه.

إذا واجهت هذا في محاولة الوصول إلى خدمات الويب المنشورة على خادم Glassfish3، فقد ترغب في ضبط إعدادات حمام التجمع HTTP الخاص بك. أن عمليات التخميدات الثابتة التي كان لدينا عندما كان العديد من المواضيع المتزامنة استدعاء خدمة الويب.

  1. انتقل إلى وحدة التحكم
  2. انتقل إلى "التكوينات" -> "Config Config" -> "تجمعات الخيط" -> "تجمع HTTP-Thread-Pool".
  3. تغيير إعداد "حجم تجمع موضوع ماكس" من 5 إلى 32
  4. تغيير إعداد "الحد الأدنى لحجم بركة الموضوع" من 2 إلى 16
  5. إعادة تشغيل نبات الزجاج.

لقد تعثرت أيضا عند هذا الخطأ. في حالتي كانت المشكلة كنت أستخدم JRE6، مع دعم TLS1.0.. وبعد الخادم يدعم فقط TLS1.2، لذلك تم إلقاء هذا الخطأ.

في حالتي، كان هذا لأن بلدي Tomcat تم تعيينه بعدم كفاية maxHttpHeaderSize لاستعلام سولر معقد بشكل خاص.

آمل أن يساعد هذا شخص هناك!

أحصل على هذا الخطأ طوال الوقت واعتبره طبيعيا.

يحدث ذلك عندما يحاول جانب واحد القراءة عندما يكون الجانب الآخر قد علق بالفعل. هكذا اعتمادا على البروتوكول قد يعين أو لا يعين مشكلةوبعد إذا كان رمز العميل الخاص بي يشير خصيصا إلى الخادم الذي سيعطله، فيمكن للعميل والخادم شنق في نفس الوقت ولن يحدث هذه الرسالة.

الطريقة التي أقوم بها الرمز الخاص بي مخصصة للعميل فقط شنق دون قول وداعا. يمكن أن يقوم الخادم بعد ذلك بالقبض على الخطأ وتجاهله. في سياق HTTP، أعتقد أن مستوى واحد من البروتوكول يسمح بطلب واحد لكل اتصال بينما الآخر لا.

وبالتالي يمكنك أن ترى كيف يمكن أن يبقى جانب واحد معلقا على الآخر. أشك في الخطأ الذي تتلقاه هو أي قلق من القلق القرصاني ويمكنك ببساطة قبض عليه للحفاظ عليه من ملء ملفات السجل الخاصة بك.

يحدث هذا الخطأ على جانب الخادم عندما أغلق العميل اتصال مأخذ التوصيل قبل أن يتم إرجاع الاستجابة عبر المقبس. في سيناريو تطبيق الويب ليس كل هذه الخطورة، نظرا لأنه يمكن إنشاء يدويا. على سبيل المثال، عن طريق الإقلاع عن المتصفح قبل استرجاع الرد.

الاستثناء يعني أنه تم إغلاق المقبس بشكل غير متوقع من الجانب الآخر. نظرا لأنك تتصل بخدمة ويب، فلا ينبغي أن يحدث هذا - على الأرجح أنك ترسل طلبا يقوم بتشغيل خطأ في خدمة الويب.

حاول تسجيل الطلب بأكمله في تلك الحالات، ومعرفة ما إذا كنت لاحظ أي شيء غير عادي. خلاف ذلك، احصل على اتصال مع مزود خدمة الويب وإرسالها طلبك المشكلات المسجلة.

أعرف أن هذا الموضوع قديم قليلا، ولكن أود أن أضيف 2 سنتات. كان لدينا نفس خطأ "إعادة تعيين الاتصال" مباشرة بعد واحدة من الإصدارات.

كان السبب الجذري، لدينا apache تم رفع الخادم لأسفل للنشر. كل حركة المرور في طرفنا الثالث apache وكنا الحصول على خطأ إعادة تعيين الاتصال بسبب كونها لأسفل.

هذا هو موضوع قديم، لكنني نفدت java.net.SocketException: Connection reset في الامس.

كان تطبيق جانب الخادم قد تغيرت إعدادات خنقها للسماح باتصال واحد فقط في وقت واحد! وبالتالي، في بعض الأحيان مرت المكالمات وأحيانا لا. أنا حل المشكلة عن طريق تغيير إعدادات الاختناق.

كنت أحصل على هذا الخطأ بالضبط أيضا: Connection reset by peer. وبعد تم رفع الاستثناء بواسطة قالب الراحة في الربيع عند تشغيل postForObject() طريقة. بالنسبة لي كانت المشكلة طويلة جدا طلب URL HTTP. قم أولا بالتحقق من ما إذا كان عنوان URL المنتج هو ما يجب أن يكون عليه، وإذا كان الخادم الخاص بك يجب أن يكون قادرا على التعامل مع طلبات هذا الطول، فما عليك سوى الانتقال إلى تكوين الخادم ورفع طول طلبات URL الموضحة الافتراضية.

حل المشكلة بالنسبة لي، ولكن يجب أن تكون على دراية: قد لا يعمل التطبيق على بعض متصفحات الإنترنت، وخاصة القديمة، لأن لديهم مدة ثابتة لطلبات URL.

آمل أن يساعد ...

حصلت على هذا الخطأ عندما يكون الملف النصي الذي كنت أحاول قراءته يحتوي على سلسلة مطابقة لتوقيع مكافحة الفيروسات على جدار الحماية لدينا.

FWIW، كنت أحصل على هذا الخطأ عندما كنت أحصل بطريق الخطأ الحصول على طلب إلى نقطة نهاية كانت تتوقع طلب المشاركة. من المفترض أن كان ذلك فقط طريقة خوادم معينة في التعامل مع المشكلة.

كنت أحصل على هذا الخطأ لأن المنفذ الذي حاولت الاتصال به تم إغلاقه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top