Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
';发布';Java中的侦听服务器套接字_Java_Sockets - Fatal编程技术网

';发布';Java中的侦听服务器套接字

';发布';Java中的侦听服务器套接字,java,sockets,Java,Sockets,我有一个线程(我们称之为connlister),它通过ServerSocket的accept()方法侦听传入连接 在另一个线程(称之为StartStopSwitch)中,我希望侦听线程停止,不再侦听给定的地址和端口 我可以使用thread.interrupt()杀死线程,但是当我通过netstat命令检查使用的端口时,我仍然看到端口状态为“正在侦听”。我想在不引发异常的情况下“释放”(或“解除绑定”)服务器套接字,这样在使用netstat时它就不会显示 现在我该怎么做呢?我不会终止/中断Serv

我有一个线程(我们称之为connlister),它通过
ServerSocket
accept()
方法侦听传入连接

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

我可以使用
thread.interrupt()
杀死线程,但是当我通过
netstat
命令检查使用的端口时,我仍然看到端口状态为“正在侦听”。我想在不引发异常的情况下“释放”(或“解除绑定”)服务器套接字,这样在使用
netstat
时它就不会显示


现在我该怎么做呢?

我不会终止/中断ServerSocket正在侦听的线程。只需从另一个线程调用ServerSocket上的close

如所述,
accept()
方法是不可中断的,因此无法终止我试图终止的connlister线程,
interrupt()
没有任何效果

相反,我必须通过StartStopSwitch线程关闭ServerSocket,导致抛出
SocketException
。似乎没有办法整齐地关闭套接字并避免抛出异常

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();
}

有关更多详细信息,请参阅。

不能使用
interrupt()终止线程。
方法是不可中断的。把插座合上。你会得到一个例外,你必须接受它。@EJP这是一个有趣的事实,也是真的。尽管不必提及,
interrupt()
如果线程正在等待可中断的操作,例如使用
ServerSocket
侦听,则该操作无效。线程状态仍然是
thread.state.RUNNABLE
@mcs>事实往往是真的,不管是否有趣,但是
ServerSocket.accept()
不是一个可中断的操作。只有
interruptablechannels
有可中断的操作,但它们没有多大用处,因为中断关闭了通道,这是因为Linux的特性必须传播到所有平台。@EJP是的,我看到我犯了一个错误:“正在等待可中断的操作”必须是“正在等待不可中断的操作”.这个答案是正确的。确保另一个线程有权访问ServerSocket变量并将其关闭。@user207421我花了4年半的时间。;-)