'Release' Java 中的监听 ServerSocket
'Release' a listening ServerSocket in Java
我有一个线程(假设它叫做 ConnListener),它通过 ServerSocket
的 accept()
方法侦听传入连接。
在另一个线程中(称之为 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。
我有一个线程(假设它叫做 ConnListener),它通过 ServerSocket
的 accept()
方法侦听传入连接。
在另一个线程中(称之为 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。