Что, собственно, означает исключение "сломанной трубы" для Socket?
У меня есть приложение для Android, которое разговаривает с программой на ПК. Я использую класс Socket Android (Java). Если я остановлю и перезапущу приложение для ПК, то в следующий раз, когда я отправлю что-нибудь с Android, я получаю исключение IO "Broken Pipe". Мой вопрос не в этом. Здесь вопрос:
После получения исключенного прерывания, если я запрашиваю метод Socket isClosed(), он возвращает false (т.е. он не закрыт), и если я запрашиваю метод Socket isConnected(), он возвращает true, то есть он подключен. Может ли кто-нибудь объяснить мне эти результаты? Спасибо заранее!
Ответы
Ответ 1
Сломанная труба означает в значительной степени то, о чем вы здесь говорите. Программа на вашей стороне все еще имеет широко открытую розетку, но сокет на другой стороне больше не обменивается данными и не проходит стандартную процедуру "закрыть трубу". Это может произойти, если другая сторона внезапно потеряла силу, если физическая линия была разорвана или что-то еще. Таким образом, локально сокет регистрируется как открытый, так и подключенный - он просто подключен к сломанной трубе. Вы хотели бы получить практический совет здесь или просто теорию?
Ответ 2
Socket.isClosed()
и Socket.isConnected()
сообщают только то, что вы сделали с сокетом. Они здесь не для того, чтобы рассказать вам о состоянии соединения. Вы не закрыли розетку: она открыта. Вы подключили сокет: он подключен.
Когда вы получаете IOException
работающее с Socket
отличным от SocketTimeoutException
вы должны закрыть сокет.