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

Что, собственно, означает исключение "сломанной трубы" для Socket?

У меня есть приложение для Android, которое разговаривает с программой на ПК. Я использую класс Socket Android (Java). Если я остановлю и перезапущу приложение для ПК, то в следующий раз, когда я отправлю что-нибудь с Android, я получаю исключение IO "Broken Pipe". Мой вопрос не в этом. Здесь вопрос:

После получения исключенного прерывания, если я запрашиваю метод Socket isClosed(), он возвращает false (т.е. он не закрыт), и если я запрашиваю метод Socket isConnected(), он возвращает true, то есть он подключен. Может ли кто-нибудь объяснить мне эти результаты? Спасибо заранее!

4b9b3361

Ответ 1

Сломанная труба означает в значительной степени то, о чем вы здесь говорите. Программа на вашей стороне все еще имеет широко открытую розетку, но сокет на другой стороне больше не обменивается данными и не проходит стандартную процедуру "закрыть трубу". Это может произойти, если другая сторона внезапно потеряла силу, если физическая линия была разорвана или что-то еще. Таким образом, локально сокет регистрируется как открытый, так и подключенный - он просто подключен к сломанной трубе. Вы хотели бы получить практический совет здесь или просто теорию?

Ответ 2

Socket.isClosed() и Socket.isConnected() сообщают только то, что вы сделали с сокетом. Они здесь не для того, чтобы рассказать вам о состоянии соединения. Вы не закрыли розетку: она открыта. Вы подключили сокет: он подключен.

Когда вы получаете IOException работающее с Socket отличным от SocketTimeoutException вы должны закрыть сокет.