读取NIO SocketChannel的超时时间?

Sam*_*Sam 3 java nio socketchannel

如果在建立连接后的一段时间内没有收到数据,设置超时以关闭NIO SocketChannel的最佳方法是什么?

use*_*421 8

Either:

  1. You are using a Selector, in which case you have a select timeout which you can play with, and if it goes off (select(timeout) returns zero) you close all the registered channels, or

  2. 您正在使用阻止模式,在这种情况下,您可能认为您应该能够调用Socket.setSoTimeout()底层套接字(SocketChannel.socket()),并捕获SocketTimeoutException在超时期满时抛出的内容read(),但您不能,因为它不支持作为通道发起的套接字,或

  3. 您正在使用没有a的非阻塞模式Selector,在这种情况下您需要更改为case(1).

所以你需要使用case(1)或者java.net.Socket直接使用case .

  • 根据[上一个问题](http://stackoverflow.com/questions/2866557/timeout-for-socketchannel-doesnt-work),案例#2不起作用.它有一个答案显示如何做到这一点. (2认同)