Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > Netty: отслеживание разрыва связи


Автор: Perl_sapiens 16.9.2012, 14:07
Доброго времени суток, уважаемые программисты.
Стал знакомится с отличным сетевым framework'ом https://netty.io/ и начал с разбора https://netty.io/Documentation/WebHome, которые прилагаются к документации. И всё вроде как понятно и просто, если бы не одна проблемка.

Запустив пример http://static.netty.io/3.5/xref/org/jboss/netty/example/http/file/package-summary.html и для эксперемента вырезав из него код, отвечающий за "кэширование" запрашиваемых файлов (NotModified), я зажал в браузере F5. В консоль стали вылетать ошибки такого содержания:
Код

java.io.IOException: Удаленный хост принудительно разорвал существующее подключение
    at sun.nio.ch.SocketDispatcher.read0(Native Method)
    at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:43)
    ... и еще 9 строк
java.nio.channels.ClosedChannelException
    at org.jboss.netty.handler.stream.ChunkedWriteHandler.discard(ChunkedWriteHandler.java:169)
    at org.jboss.netty.handler.stream.ChunkedWriteHandler.flush(ChunkedWriteHandler.java:289)
    ... и еще 17 строк
java.io.IOException: Программа на вашем хост-компьютере разорвала установленное подключение
    at sun.nio.ch.SocketDispatcher.write0(Native Method)
    at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:51)
    ... и еще 34 строки
java.nio.channels.ClosedChannelException
    at org.jboss.netty.handler.stream.ChunkedWriteHandler.discard(ChunkedWriteHandler.java:169)
    at org.jboss.netty.handler.stream.ChunkedWriteHandler.flush(ChunkedWriteHandler.java:289)
    ... и еще 21 строка


Через дебаггер отметил, что ошибки эти вылезают сразу после попытки записать что-то в канал (ch.write(response);), но при этом все состояния канала (connected, open, bound, readable, writable) находятся в положительном состоянии (true).

Как отследить момент, когда соединение было разорвано, что бы зря не пытаться записать что-то в закрытый канал?

Автор: COVD 16.9.2012, 14:50
Цитата

ошибки эти вылезают сразу после попытки записать 

В сетевых операциях "попытки записать" - это единственный способ установить, что соединение разорвано. Чтобы  "зря не пытаться записать" надо хотя бы один раз попытаться, получить отказ, и после этого можно принять решения отказаться от повторных попыток. "Разрыв" означает всего лишь, что послали сигнал, но не получили в ответ подтверждение приема. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)