服务器套接字超时和排队连接



>我有一个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 会丢弃在其上排队的连接吗?

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

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

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

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

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

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

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

相关内容

最新更新