gpt4 book ai didi

java - 使用 ServerSocketChannel 设置阻塞 I/O 操作的超时不能按预期工作

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:52:00 27 4
gpt4 key购买 nike

我正在用 Java 开发一个小组对话服务器,我目前正在破解网络代码,但似乎我无法在阻塞 I/O 操作上设置正确的超时:我可能被某些 Java 攻击了怪异(或者,简单地说,我误解了 javadoc)。

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

class ConversationServer {

// ...

public int setup() throws IOException {
ServerSocketChannel server = ServerSocketChannel.open();
server.bind(new InetSocketAddress(port), Settings.MAX_NUMBER_OF_PLAYERS + 1);

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

int numberOfPlayers;

for (numberOfPlayers = 0; numberOfPlayers < Settings.MAX_NUMBER_OF_PLAYERS; ++numberOfPlayers) {
SocketChannel clientSocket;

try {
clientSocket = server.accept();
} catch (SocketTimeoutException timeout) {
break;
}

clients.add(messageStreamFactory.create(clientSocket));
}

return numberOfPlayers;
}

// ...

}

预期的行为是让最多连接 Settings.MAX_NUMBER_OF_PLAYERS 个客户端,或者在 Settings.AWAIT_PLAYER_MS 毫秒(当前为 30000L)后终止设置>).

会发生什么,如果我连接 Settings.MAX_NUMBER_OF_PLAYERS 客户端,一切都很好(因为 for 条件而退出),但如果我不连接,SocketTimeoutException 我期望永远不会抛出并且服务器永远挂起。

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

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

最佳答案

如果您从

更改,看起来超时有效
server.socket().setSoTimeout((int) Settings.AWAIT_PLAYERS_MS);
server.accept();

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

即在设置 SO 超时的同一对象上调用 accept()。我对 NIO 套接字的了解还不够,无法准确说明这样做的结果。也许其他人可以阐明一些问题。

关于java - 使用 ServerSocketChannel 设置阻塞 I/O 操作的超时不能按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17133620/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com