Тайм-аут чтения для NIO SocketChannel?

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

2 ответа

Решение

Или:

  1. Вы используете Selector, в этом случае у вас есть время ожидания выбора, с которым вы можете играть, и если оно сработало (select(timeout) возвращает ноль) вы закрываете все зарегистрированные каналы, или

  2. Вы используете режим блокировки, в этом случае вы можете подумать, что сможете позвонить Socket.setSoTimeout() на нижнем сокете (SocketChannel.socket()) и поймать SocketTimeoutException бросается, когда время ожидания истекает во время read(), но вы не можете, потому что это не поддерживается для сокетов, создаваемых как каналы, или

  3. Вы используете неблокирующий режим без Selector, в этом случае вам нужно перейти на случай (1).

Так что вам нужно использовать case (1) или java.net.Socket непосредственно.

Я искал ту же рекомендацию и не мог найти ее легко - поделился ею здесь.

Для netty есть хороший обработчик: ReadTimeoutHandler.

Можно использовать это так

channel.pipeline().addLast(new ReadTimeoutHandler(readTimeout));

он будет отбрасывать исключение io.netty.handler.timeout.ReadTimeoutException, если не удалось увидеть какие-либо данные, выполняющие заданное время ожидания чтения.

Другие вопросы по тегам