当我这样编码:
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
?
答案 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。