【发布时间】:2013-06-27 10:41:21
【问题描述】:
如果在连接建立后的一段时间内没有收到数据,设置超时关闭 NIO SocketChannel 的最佳方法是什么?
【问题讨论】:
标签: java nio socketchannel
如果在连接建立后的一段时间内没有收到数据,设置超时关闭 NIO SocketChannel 的最佳方法是什么?
【问题讨论】:
标签: java nio socketchannel
要么:
您正在使用Selector,在这种情况下,您可以使用选择超时,如果超时(select(timeout) 返回零)关闭所有已注册的频道,或者
您正在使用阻塞模式,在这种情况下,您可能认为您应该能够在底层套接字 (SocketChannel.socket()) 上调用 Socket.setSoTimeout(),并捕获超时到期时抛出的 SocketTimeoutException在read() 期间,但你不能,因为它不支持作为通道发起的套接字,或者
您正在使用没有Selector 的非阻塞模式,在这种情况下,您需要更改为情况(1)。
因此,您要么需要使用 case (1),要么直接使用 java.net.Socket。
【讨论】:
我正在寻找相同的建议,但无法轻松找到 - 在这里分享。
netty 有一个不错的处理程序,称为:ReadTimeoutHandler。
可以这样使用
channel.pipeline().addLast(new ReadTimeoutHandler(readTimeout));
当未能看到任何执行定义的读取超时的数据时,它将丢弃 io.netty.handler.timeout.ReadTimeoutException。
【讨论】: