当我使用nio时,serverSocket.accept()抛出IllegalBlockingModeException

时间:2008-11-30 14:55:48

标签: java nio

当我这样编码:

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

3 个答案:

答案 0 :(得分:2)

Javadoc明确指出ServerSocketChannel.accept()

  

接受与此频道套接字的连接。

     

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

一般的想法是:

  • 如果要在等待传入连接时阻止,请将服务器套接字置于阻止模式。如果您正在编写一个无法实现连接的服务器,那么阻塞模式就是您想要的。
  • 如果您想做其他事情,并定期检查是否有未决连接,您需要非阻止模式。

阻止模式是默认设置的原因:大多数服务器不想轮询其接受套接字以获取传入连接。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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