1

当我这样编码时:

ServerSocketChannel ssc = ServerSocketChannel.open();
InetSocketAddress sa = new InetSocketAddress("localhost",8888);
ssc.socket().bind(sa);
ssc.configureBlocking(false);
ssc.socket().accept();

ServerSocket.accept()方法抛出java.nio.channels.IllegalBlockingModeException. 为什么我不能打电话accept(),即使我将阻止设置为false

4

3 回答 3

3

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

于 2009-02-13T15:49:52.963 回答
2

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

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

于 2008-11-30T15:12:12.660 回答
2

Javadoc 特别指出ServerSocketChannel.accept()

接受与此通道的套接字建立的连接。

如果此通道处于非阻塞模式,则如果没有挂起的连接,此方法将立即返回 null。否则它将无限期地阻塞,直到有新的连接可用或发生 I/O 错误。

总体思路是:

  • 如果您想在等待传入连接时阻塞,您可以让服务器套接字处于阻塞模式。如果您正在编写一个在连接实际进入之前无事可做的服务器,那么阻塞模式就是您想要的。
  • 如果您想做其他事情,并定期检查是否有挂起的连接,则需要非阻塞模式。

阻塞模式是默认的,原因是:大多数服务器不希望轮询其接受套接字以获取传入连接。

于 2009-01-10T18:37:44.700 回答