Как понять удаленный сокет Java недоступен, когда устройство удаленного сокета выключено или приложение закрыто
У меня есть серверный сокет as3, мы подключаемся к этому серверному сокету через сокет Java (приложение для Android). Проблема заключается в том, что, когда приложение serversocket закрывается, я не могу найти способ понять, что удаленный сокет закрыт или недоступен, кроме как при попытке сброса () сообщения этому сокету выдает ошибку сломанного канала. Причина, по которой я хочу решить эту проблему другим способом, заключается не в том, чтобы серверное приложение было занято сообщениями о проверке соединения?
4 ответа
TCP-соединение не является непрерывным потоком, как река. Это последовательность сегментов, отправляемых в разное время, поэтому она больше похожа на автомобили на дороге. Таким образом, нет никакого способа получить уведомление, если дорога сломана, пока машина не попытается добраться до другого конца, выйдет из строя и перезвонит вам.
Вы должны просто продолжать отправлять автомобили через разумные промежутки времени (30 секунд?), Тем самым инструктируя ваш сервер ничего не делать, когда он получает сообщение NOOP (сокращение от No Operation). Клиент будет запрограммирован на отправку NOOP, когда соединение бездействует (сообщение не отправлено или не получено в течение 30 секунд), и когда драйвер перезванивает, что он не может достичь пункта назначения, вы закрываете текущий сокет и пытаетесь создать другой один.
TCP может понять, что соединение закрыто, тремя способами:
- Одна сторона получила ошибку - она отправляет запрос сброса на другую сторону, чтобы закрыть соединение
- Одна сторона на самом деле хочет закрыть соединение, поэтому отправляет сообщение FIN другой стороне.
- Тайм-аут при попытке передать что-то с одной стороны на другую. Этот тайм-аут может произойти только при отправке tcp-пакета. После установления соединения пакеты tcp отправляются только по запросу на передачу данных (и к запросу на закрытие соединения...).
Таким образом, если одна сторона отключается внезапно, не в середине передачи данных, нет способа обнаружить разрыв, кроме как посылать какой-то пакет время от времени.
Вы нашли единственный путь. TCP не предоставляет никакого способа проверки состояния соединения, кроме попыток его использовать. Вы можете использовать это более разумно, например, вы можете отправлять себе сообщения сердцебиения и так далее. Но нет API, который скажет вам.
Что вы можете сделать, это позволить серверу транслировать сообщение " Я жив" каждые 5/10 минут:)