2015-01-23 3 views
0

может кто-нибудь сказать мне, почему я не получу исключение, если удаленный сокет закрывается и отправляет FIN + ACK? Wireshark сообщает мне, что FIN + ACK получен и ACK отправляется ОС.Java Socket: no Exception on remote FIN + ACK локальный ACK

Вот мой код. Я действительно пробовал все.

byte firstByte = (byte)instream.read(); 
if (firstByte == -1){ 
    return null; 
} 
byte[] bytes = new byte[instream.available() + 1]; 
bytes[0] = firstByte; 
instream.read(bytes, 1, bytes.length - 1); 

водоток имеет Socket.getInputStream(), outstream из Socket.getOutputStream().

Соединение будет закрыто моими 15 секундными биениями.

+0

Сокет закрыт с другой стороны, и следующая операция для чтения из сокета с этой стороны просто скажет вам, что читать с такого же конца файла нечего. Но если вы закроете сокет со своей стороны и выполните эту операцию, он даст вам исключение, например, чтение из закрытого файла. Вы используете InputStream и как таковой скрываете то, что внизу (файл или сокет), и действуют одинаково для обоих – ata

ответ

0

Это не системная ошибка для удаленного компьютера для закрытия сетевого подключения. Попытка чтения с InputStream, связанная с Socket, представляющая локальный конец закрытого соединения, обнаружит условие конца файла, что является естественной возможностью для любого Inputstream.

По its docs, InputStream.read() возвращает -1, когда конец файла достигнут. Для InputStream сетевого сокета это довольно надежная индикация того, что соединение было закрыто.

Что нужно, чтобы следить за удаленным клиентом, удалив соединение, не закрывая его чисто. Локальная машина не может обнаружить это, и попытка чтения из локального сокета такого соединения будет блокироваться бесконечно.

+0

Да. Я попытался прочитать -1, но не работал должным образом. Может, я сделал что-то не так. Но, спасибо, я попробую еще раз. –

+0

Обратите внимание, что 'InputStream.read()' возвращает 'int'. Вы должны прочитать это как таковое, чтобы различать значения '-1' и' 255', оба из которых дают '-1' при усечении, чтобы ввести' byte'. –

+0

Ну ладно. Работает отлично! Очевидно, я сделал что-то не так. –

Смежные вопросы