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