Тайм-аут чтения для NIO SocketChannel?
Каков наилучший способ установить тайм-аут для закрытия NIO SocketChannel, если в течение определенного периода после получения соединения данные не принимаются?
2 ответа
Или:
Вы используете
Selector
, в этом случае у вас есть время ожидания выбора, с которым вы можете играть, и если оно сработало (select(timeout)
возвращает ноль) вы закрываете все зарегистрированные каналы, илиВы используете режим блокировки, в этом случае вы можете подумать, что сможете позвонить
Socket.setSoTimeout()
на нижнем сокете (SocketChannel.socket()
) и пойматьSocketTimeoutException
бросается, когда время ожидания истекает во времяread()
, но вы не можете, потому что это не поддерживается для сокетов, создаваемых как каналы, илиВы используете неблокирующий режим без
Selector
, в этом случае вам нужно перейти на случай (1).
Так что вам нужно использовать case (1) или java.net.Socket
непосредственно.
Я искал ту же рекомендацию и не мог найти ее легко - поделился ею здесь.
Для netty есть хороший обработчик: ReadTimeoutHandler.
Можно использовать это так
channel.pipeline().addLast(new ReadTimeoutHandler(readTimeout));
он будет отбрасывать исключение io.netty.handler.timeout.ReadTimeoutException, если не удалось увидеть какие-либо данные, выполняющие заданное время ожидания чтения.