'Release' Java 中的监听 ServerSocket

'Release' a listening ServerSocket in Java

我有一个线程(假设它叫做 ConnListener),它通过 ServerSocketaccept() 方法侦听传入连接。

在另一个线程中(称之为 StartStopSwitch)我希望监听线程停止,不再监听给定的地址和端口。

我可以使用 Thread.interrupt() 终止线程,但是当我通过 netstat 命令检查使用的端口时,我仍然看到状态为 'LISTENING' 的端口。我想'release'(或'unbind')ServerSocket,不抛出异常,所以在使用netstat.

时不会出现

现在我该怎么做?

我不会kill/interrupt ServerSocket 侦听的线程。只需在另一个线程的 ServerSocket 上调用 close 即可。

正如 EJP 所说,accept() 方法不可中断,因此我试图杀死 ConnListener 线程 不能被杀死interrupt()没有效果。

相反,我不得不通过 StartStopSwitch 线程关闭 ServerSocket,导致抛出 SocketException。好像没有什么办法可以整齐的关闭socket,避免抛出异常。

try {
    Socket socket = serverSocket.accept();
}
catch (SocketException exc) {
    // SocketException is thrown when serverSocket is closed.
}
finally {
    // You don't have to close the socket, because in order to
    // reach this block, another thread had to close the socket.

    //serverSocket.close();
}

有关详细信息,请参阅 this Whosebug post