Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用ServerSocketChannel设置阻止I/O操作的超时不';I don’我没有按预期工作_Java_Socketchannel - Fatal编程技术网

Java 使用ServerSocketChannel设置阻止I/O操作的超时不';I don’我没有按预期工作

Java 使用ServerSocketChannel设置阻止I/O操作的超时不';I don’我没有按预期工作,java,socketchannel,Java,Socketchannel,我正在用Java开发一个小组对话服务器,目前正在破解网络代码,但似乎我无法设置阻止I/O操作的正确超时时间:很可能我已经被一些Java怪癖(或者,简单地说,我误解了javadoc)咬了一口 因此,这是来自ConversationServer类的相关代码(为了简单起见,去掉了所有安全检查和日志记录): 类会话服务器{ // ... public int setup()引发IOException{ ServerSocketChannel服务器=ServerSocketChannel.open();

我正在用Java开发一个小组对话服务器,目前正在破解网络代码,但似乎我无法设置阻止I/O操作的正确超时时间:很可能我已经被一些Java怪癖(或者,简单地说,我误解了javadoc)咬了一口

因此,这是来自
ConversationServer
类的相关代码(为了简单起见,去掉了所有安全检查和日志记录):

类会话服务器{
// ...
public int setup()引发IOException{
ServerSocketChannel服务器=ServerSocketChannel.open();
绑定(新的InetSocketAddress(端口),Settings.MAX\u NUMBER\u播放器+1);
server.socket();
国际球员人数;
对于(numberOfPlayers=0;numberOfPlayers
预期的行为是允许连接
设置。最多允许\u个玩家
客户端,或者在
设置后终止安装。等待\u个玩家
毫秒(当前为
30000L

发生的情况是,如果我连接
Settings.MAX\u NUMBER\u玩家
客户端,一切都很好(因为
for
条件退出),但如果我不这样做,我期望的
SocketTimeoutException
将永远不会抛出,服务器将永远挂起

如果我理解正确,
server.socket()应该足够了,但它没有给出预期的行为


那么,有人能在这里发现错误吗?

如果从

server.socket().setSoTimeout((int) Settings.AWAIT_PLAYERS_MS);
server.accept();


即,在设置SO超时的同一对象上调用
accept()
。我对NIO套接字了解不够,无法确切说明这样做的结果。也许其他人能给我们一些启示。

问得好。。。根据javadoc,这应该可以工作。我可以确认,在64位JDK 1.7.0_21或几周前Win 7中的JDK8版本上运行IDEA时,对我来说,它没有超时……在使用OpenJDK 1.7.0_21的Ubuntu服务器上,直接从命令行运行也是如此。不过,在这种情况下,结果将是一个
套接字
;您必须在其上设置
.getChannel()
,才能获得
SocketChannel
。奇怪的是,从1.7开始,您在
SocketChannel
上有一个
.setOption()
,但无法设置超时:/the
.socket().accept().getChannel()
解决方案运行良好。然后这是一个爪哇的奇怪(可悲)!人们在JDK8上也报道了这种情况,这有点令人不安。我的意思是,NIO的使用如此罕见吗?
server.socket().setSoTimeout((int) Settings.AWAIT_PLAYERS_MS);
server.accept();
server.socket().setSoTimeout((int) Settings.AWAIT_PLAYERS_MS);
server.socket().accept();