3

我正在使用 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_MS30000L

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

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

那么,任何人都可以在这里发现错误吗?

4

1 回答 1

3

如果您从

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

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

即调用accept()您设置SO 超时的同一对象。我对 NIO 套接字的了解还不够,无法准确说明这样做会产生什么结果。也许其他人可以提供一些启示。

于 2013-06-16T13:49:00.550 回答