سؤال

لدي مقبس يعمل ، باستخدام المختارين. أحاول التحقق لمعرفة ما إذا كان المقبس الخاص بي متصلاً بالخادم أم لا.

Boolean connected = _channel.isConnected();

ودائما يعود صحيح. قمت بإيقاف تشغيل المطار (اتصال الإنترنت) على جهاز الكمبيوتر الخاص بي ، وعندما أتحقق لمعرفة ما إذا كان المقبس متصلاً أم لا ، فإنه لا يزال صحيحًا. أي فكرة لماذا؟ أحاول كتابة البيانات إلى الخادم كل 3 ثوانٍ ، ولا يزال لا يغير حالة المقبس الخاص بي إلى قطع الاتصال.

هل كانت مفيدة؟

المحلول

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

ولكن بشكل أعم ، لا يمكننا أن نكون متأكدين مما إذا تم تسليم الحزمة. في Java (ربما C أيضًا) ، لا توجد طريقة للتحقق مما إذا كانت الحزمة قد تم.

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

لذلك إذا كنت تريد التأكد حقًا ، فلا يمكنك الاعتماد على بروتوكول النقل. يجب أن تمتلك مستوى التطبيق ACK, ، أي أن تطبيق الخادم يكتب رسالة ACK بعد استلامها و معالجة رسالة من العميل.

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

نصائح أخرى

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

لم يتم إغلاق القناة عندما لا يكون الخادم متاحًا بعد الآن ، بسبب اتصال فعلي مكسور أو فشل خادم. لذلك بمجرد إنشاء اتصال ، isConnected() سوف يعود true حتى تغلق القناة على جانبك.

إذا كنت ترغب في التحقق ، إذا كان الخادم لا يزال متاحًا ، فأرسل بايت إلى Sockets OutputStream. إذا حصلت على استثناء ، فإن الخادم غير متوفر (فقد الاتصال).


يحرر

بالنسبة إلى EJP - بعض التعليمات البرمجية لاختبار وتعليق تعليقك والإجابة:

public class ChannelTest {
     public static void main(String[] args) throws UnknownHostException, IOException {
      Socket google = new Socket(InetAddress.getByName("www.google.com"), 80);
      SocketChannel channel = SocketChannel.open(google.getRemoteSocketAddress());
      System.out.println(channel.isConnected());
      channel.close();
      System.out.println(channel.isConnected());
    }
}

الإخراج على جهازي هو

true
false

يخبرك iSconnected () ما إذا كان أنت لقد ربطت قناة الكائن ، الذي لديك ، ولم يتم تحديده لإرجاع خطأ بعد إغلاقه ، على الرغم من أنه يبدو أنه: انظر إجابة أندرياس. ليس هناك لإخبارك ما إذا كان الكامنة الإتصال لا يزال هناك. يمكنك فقط معرفة ذلك عن طريق استخدامه: -1 من قراءة ، أو استثناء ، يخبرك بذلك.

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