我有一个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是否会丢弃排队的连接?
那是另一个问题;连接排队?
答案 0 :(得分:0)
循环中有循环。您的代码只能处理一个连接。 您可以尝试新线程中的每个传入套接字进程,并以某种方式保持全局状态(您的关闭挂钩),也许在一些单例中?
从某些连接线程中,您可以设置全局变量并停止接受新套接字。
答案 1 :(得分:0)
ServerSocket是否会丢弃排队的连接?
不使用此代码。如果发生超时,则不会丢失任何排队连接。
那是另一个问题;连接排队了吗?
是的,有一个名为' backlog queue'的东西,其大小可以通过构造函数的backlog
参数模糊地控制。