ServerSocket超时和排队连接

时间:2017-07-31 20:46:34

标签: java sockets timeout

我有一个ServerSocket,它接受一个无限循环中的连接。但是,当用户要求关闭程序时,我希望它停止接受连接并完成当前打开的连接的处理。

我有一个关闭钩子,它设置一个标志,以便程序知道用户不再接受任何连接的意图。但是,到设置此标志时,它已在accept()上被阻止。如果我做这样的事情:

ServerSocket servsoc = new ServerSocket(port);
servsoc.setSoTimeout(2000);

// Infinite loop processing connections
while (!shutdown) {
    do {
        try {
            connected = true;
            socket = servsoc.accept();
        } catch (SocketTimeoutException tim) {
            connected = false;
        }
    } while (!shutdown && !connected)

    if (connected) {
        ... remainder of code ...
    }
}

ServerSocket是否会丢弃排队的连接?

那是另一个问题;连接排队

2 个答案:

答案 0 :(得分:0)

循环中有循环。您的代码只能处理一个连接。 您可以尝试新线程中的每个传入套接字进程,并以某种方式保持全局状态(您的关闭挂钩),也许在一些单例中?

从某些连接线程中,您可以设置全局变量并停止接受新套接字。

答案 1 :(得分:0)

  

ServerSocket是否会丢弃排队的连接?

不使用此代码。如果发生超时,则不会丢失任何排队连接。

  

那是另一个问题;连接排队了吗?

是的,有一个名为' backlog queue'的东西,其大小可以通过构造函数的backlog参数模糊地控制。