【发布时间】: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”消息以中断接受循环。