2008-11-30 98 views

回答

1

因为这就是serversocket.accept()所说的javadoc?

IllegalBlockingModeException - 如果此套接字具有关联的通道,并且通道处于非阻塞模式。

+0

感谢您的帮助:) – user41940 2008-11-30 15:24:36

2

的Javadoc明确规定,ServerSocketChannel.accept()

接受到此通道套接字的连接。

如果此通道处于非阻塞模式,则此方法将立即在没有挂起连接的情况下返回空值 。否则,它将无限期地阻止 ,直到出现新的连接或发生I/O错误。

的总体思路是:

  • 如果你想在等待进入的连接来阻止,你离开服务器套接字阻塞模式。如果你编写的服务器在连接实际进行之前无所事事,那么阻塞模式就是你想要的。
  • 如果您想要做其他事情,并定期检查是否存在挂起的连接,则需要非阻塞模式。

阻塞模式是默认的一个原因:大多数服务器不想轮询他们接收套接字的传入连接。

1

问题是你打电话给ssc.socket().accept(),而不是ssc.accept()。如果将最后一行更改为ssc.accept(),那么它将按预期工作,如果有人正在等待,则返回一个SocketChannel;否则返回null。