Подтвердить что ты не робот

Как проверить, подключен ли Socket к Java?

Я пытаюсь выяснить, подключена ли сейчас Java-Socket Socket, следующее просто говорит мне, был ли сокет подключен в какой-то момент, а не в настоящее время он все еще подключен.

socket.isConnected();

Любая благодарность, спасибо.

4b9b3361

Ответ 1

  • socket.isConnected() возвращает всегда true, как только клиент подключится (и даже после отключения) странно!!
  • socket.getInputStream().read()
    • заставляет поток ждать ввода до тех пор, пока клиент подключен, и поэтому ваша программа ничего не делает - за исключением случаев, когда вы получаете какой-либо ввод
    • returns -1, если клиент отключен
  • socket.getInetAddress().isReachable(int timeout): От isReachable (int timeout)

    Проверьте, доступен ли этот адрес. Наилучшие усилия прилагаются для реализации, чтобы попытаться добраться до хоста, но брандмауэры и конфигурация сервера могут блокировать запросы, приводящие к недостижимому статусу, в то время как некоторые определенные порты могут быть доступны. Типичная реализация будет использовать ICMP ECHO REQUESTs, если эта привилегия может быть получена, в противном случае она попытается установить TCP-соединение на порте 7 (Echo) хоста назначения.

Ответ 2

Предполагая, что у вас есть некоторый уровень контроля над протоколом, я большой поклонник отправки пульса, чтобы проверить, что соединение активно. Он оказался самым отказоустойчивым методом и часто дает вам самое быстрое уведомление, когда соединение было сломано.

TCP keepalives будет работать, но что, если удаленный хост внезапно отключится? TCP может занять много времени. С другой стороны, если у вас есть логика в вашем приложении, которая ожидает, что биение будет отвечать каждые x секунд, в первый раз, когда вы их не получите, вы знаете, что соединение больше не работает, либо по сети, либо по серверной проблеме на удаленной стороне.

См. Нужно ли мне биться, чтобы открыть TCP-соединение? для более подробного обсуждения.