Как поймать сломанную трубу для розеток?

Я написал клиент-серверное приложение Java с использованием сокетов. Я использую метод writeUnshared() изObjectOutputStream и readObject() из ObjectInputStream.

Теперь я хотел бы определить, когда соединение разорвано, чтобы восстановить соединение (например, когда сигнал Wi-Fi был потерян). В настоящее время для ObjectInputStream я ловлю EOFException, а для ObjectOutputStream я ловлю IOException, чтобы определить, не повреждена ли труба.

Это правильно или я должен поймать IOException для обоих потоков?


person machinery    schedule 24.03.2019    source источник
comment
Вы должны поймать IOException для обоих потоков. Вы получите EOFException только в том случае, если одноранговый узел закрылся и результирующие передачи прошли успешно. Не при сбое сети. Все IOExceptions, кроме SocketTimeoutException, являются фатальными для соединения.   -  person user207421    schedule 25.03.2019


Ответы (1)


Вы можете использовать Javadoc, который рекомендует перехватывать IOException для всех обычных исключений, связанных с вводом-выводом.

Или вы можете пройти собственное тестирование.

Или вы можете воспользоваться исходным кодом, который показывает, что при использовании режима «блочных данных» EOFException используется сериализацией всякий раз, когда не хватает байтов для построения полного объекта. Однако это не будет охватывать все случаи разрыва соединения.

Учитывая все обстоятельства, я бы рекомендовал IOException.

person Sean F    schedule 24.03.2019