如果在连接建立后的一段时间内没有收到数据,那么设置超时关闭NIO SocketChannel的最佳方法是什么?NIO SocketChannel的读取超时?
3
A
回答
4
或者:
您使用的是
Selector
,在这种情况下,你有一个选择超时,你可以玩,如果它熄灭(select(timeout)
返回零)关闭所有已注册频道,或您正在使用阻塞模式,在这种情况下,你应该能够调用
Socket.setSoTimeout()
基础套接字(SocketChannel.socket()
)和陷阱在SocketTimeoutException
当超时期间read()
到期时抛出,或您正在使用非阻塞模式,而不使用
Selector
,在这种情况下,您需要更改为情况(1)。
注意,为了使(2)工作,你需要换行通道,以获得InputStream
,这意味着如果你使用的是阻塞模式下,你可能也只是使用Socket
。感谢@Matthieu的提示。
1
我在寻找相同的建议,无法轻松找到 - 在此分享。
netty有一个很好的处理程序叫做ReadTimeoutHandler。
人们可以使用它像
channel.pipeline().addLast(new ReadTimeoutHandler(readTimeout));
时没有看到任何数据做定义读取超时就会下降io.netty.handler.timeout.ReadTimeoutException。
相关问题
- 1. Java nio在选择器上读取SocketChannel
- 2. Java NIO SocketChannel读预定义字节数
- 3. 超时上与插座使用NIO的SocketChannel
- 4. Java NIO SocketChannel写入问题
- 5. SocketChannel保持读取-1
- 6. 的java NIO的SocketChannel读总是返回相同的数据
- 7. 的Java NIO的SocketChannel ISOPEN和isConnected方法
- 8. 用Java NIO /选择器获取读超时的任何方法?
- 9. 为什么Socket使用流,但NIO SocketChannel使用读/写?
- 10. 的SocketChannel读()行为 - 短读取
- 11. 如何在Java NIO中刷新SocketChannel?
- 12. 超时的SocketChannel不起作用
- 13. SocketChannel - java.net.ConnectException:连接超时:连接
- 14. Java SocketChannel写入和读取关联
- 15. 无法从SocketChannel读取数据
- 16. SocketTimeoutException:读取超时
- 17. MySQLdb读取超时
- 18. asio ::超时读取
- 19. pcap的零读取超时
- 20. Python-超时读取URL时
- 21. 如何让选择器在Java中的socketchannel键更改nio
- 22. Java NIO - 使用SocketChannel接收数据的问题
- 23. 如何通过NIO中的SocketChannel发送和接收对象
- 24. SSL连接超时和读取超时
- 25. fread超时'mod_fcgid:读取超时管道'
- 26. 读取超时后重新读取ResponseStream
- 27. HttpMessageNotReadableException:无法读取JSON:读取超时
- 28. 使用NIO VS RandomAccessFile的读取文件
- 29. 在Java NIO中,是否对客户端SocketChannel有用?
- 30. java nio socketchannel:客户端到多个服务器
我正在使用案例1.但据我所知,如果根本没有选择任何通道,则会触发select(超时)。我需要做的是关闭一个已经连接的SocketChannel,如果它在给定的时间内没有发送任何可读数据(即:从OP_ACCEPT改变为OP_READ)。我有道理吗? – Sam
当然,但你不能直接在第一种情况下这样做。你必须跟踪每个通道的最后读取时间并操作选择超时,以便最近最少读取的通道的超时将在没有任何事情发生时过期,检查所有通道超时等 – EJP
将尝试,谢谢! – Sam