هل قمت بتكوين مقبس Java بحيث يفشل بسرعة عند قطع الاتصال؟
-
09-06-2019 - |
سؤال
لدي منفذ استماع على الخادم الخاص بي وأتصل به باستخدام فئة Java و Socket
واجهة، أي.
Socket mySocket = new Socket(host,port);
ثم أمسك OutputStream
, ، تزيين ب PrintWriter
في وضع التدفق التلقائي وأنا أضحك - إلا إذا تم إغلاق منفذ الاستماع.ثم أحصل
tcp4 0 0 *.9999 *.* LISTEN
tcp 0 0 127.0.0.1.45737 127.0.0.1.9999 CLOSE_WAIT
ويبدو أنني لا أستطيع اكتشاف المشكلة في البرنامج - لقد حاولت استخدام isConnected()
الطريقة على المقبس ولكن لا يبدو أن الاتصال مغلق.
أريد أن أكون على دراية بالمشكلة في المرة القادمة التي أحاول فيها الكتابة إلى المقبس حتى أتمكن من محاولة إعادة الاتصال والإبلاغ عن المشكلة.
أي نصيحة من فضلك؟
شكرا لكم جميعا
المحلول
تعيين مهلة قصيرة؟
يفعل isOutputShutdown()
لا تحصل على ما تريد؟
يمكنك دائمًا بناء ملف SocketWatcher
الطبقة التي تدور في حد ذاتها Thread
ويحاول بشكل متكرر كتابة سلاسل فارغة إلى ملف Socket
حتى يرفع ذلك أ SocketClosedException
.
نصائح أخرى
الطريقة الوحيدة الموثوقة لاكتشاف الاتصال المقطوع في TCP هي الكتابة إليه، مما سيؤدي في النهاية إلى "إعادة تعيين الاتصال" IOException.ومع ذلك، نظرًا للتخزين المؤقت، لن يحدث ذلك عند الكتابة الأولى بعد قطع الاتصال، ولكن عند الكتابة اللاحقة.لا يمكنك فعل أي شيء حيال ذلك.
قم بتعيين موضوع مختلف للقراءة من المقبس.سيتم حظره حتى يتم إغلاق المقبس، ثم سيتم طرح استثناء.قبض على هذا الاستثناء لاكتشاف الإغلاق على الفور.