java-使用ServerSocketChannel设置阻止I / O操作的超时无法按预期工作

我正在使用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客户端,一切都很好(因为出于条件而退出),但是如果我不这样做,则不会抛出我期望的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套接字知之甚少,无法确切地说出这样做的结果.也许其他人可以阐明一些想法.

上一篇:docker下安装mysql数据库


下一篇:Java NIO学习系列二:Channel