【问题标题】:ServerSocket timeout and queued connectionsServerSocket 超时和排队连接
【发布时间】:2017-07-31 20:46:34
【问题描述】:

我有一个接受无限循环连接的 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 是否会丢弃在其上排队的连接?

这是另一个问题;连接是否排队

【问题讨论】:

  • 中断线程不会使套接字脱离接受调用。您可以做的是让设置关闭标志的方法打开与服务器套接字的连接并发送“noop”消息以中断接受循环。

标签: java sockets timeout


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    这是另一个问题;连接是否排队?

    是的,有一个东西叫做“积压队列”,它的大小可以通过构造函数的backlog参数模糊控制。

    【讨论】:

      猜你喜欢
      • 2011-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-02
      相关资源
      最近更新 更多