如何中断ServerSocket accept()方法?

luk*_*o05 136 java networking interrupt blocking

在我的主线程中,我有一个while(listening)调用accept()我的ServerSocket对象的循环,然后启动一个新的客户端线程,并在接受新客户端时将其添加到Collection.

我还有一个Admin线程,我想用它来发出命令,比如'exit',这将导致所有客户端线程被关闭,自行关闭,并通过转向监听来关闭主线程.

但是,accept()while(listening)循环块中调用,并且似乎没有任何方法可以中断它,因此无法再次检查while条件并且程序无法退出!

有一个更好的方法吗?或者某种方式来中断阻塞方法?

Sim*_*olt 144

你可以close()从另一个线程调用,然后accept()调用将抛出一个SocketException.

  • 奇怪的是,文档中没有此信息:http://download.oracle.com/javase/6/docs/api/java/net/ServerSocket.html#accept%28%29方法未标记为抛出SocketException.它只在这里提到http://download.oracle.com/javase/1.4.2/docs/api/java/net/ServerSocket.html#close%28%29 (4认同)
  • 如果连接已经被接受并且线程正在等待一些数据该怎么办:while((s = in.readLine())!= null)? (3认同)
  • 谢谢,如此明显,甚至没有发生在我身上!我退出循环后调用close(). (2认同)

Juh*_*älä 27

设置超时accept(),然后调用将在指定时间后超时阻塞:

http://docs.oracle.com/javase/7/docs/api/java/net/SocketOptions.html#SO_TIMEOUT

在阻止Socket操作上设置超时:

ServerSocket.accept();
SocketInputStream.read();
DatagramSocket.receive();
Run Code Online (Sandbox Code Playgroud)

必须在进入阻止操作之前设置该选项才能生效.如果超时到期并且操作将继续阻止,java.io.InterruptedIOException则引发.该Socket不会在这种情况下关闭.


Lau*_*nen 9

呼唤close()ServerSocket一个选择吗?

http://java.sun.com/j2se/6/docs/api/java/net/ServerSocket.html#close%28%29

关闭此套接字.当前在accept()中被阻塞的任何线程都将抛出SocketException.