Java nio Channel.register抛出IllegalArgumentException
我正在尝试java nio的套接字服务器通道和选择器,如下所示:Java nio Channel.register抛出IllegalArgumentException,java,sockets,server,nio,channel,Java,Sockets,Server,Nio,Channel,我正在尝试java nio的套接字服务器通道和选择器,如下所示: try { // server side main function ServerSocketChannel listenChannel = ServerSocketChannel.open(); listenChannel.socket().bind(new InetSocketAddress(12112)); Selector selector = Selector.open(); listen
try { // server side main function
ServerSocketChannel listenChannel = ServerSocketChannel.open();
listenChannel.socket().bind(new InetSocketAddress(12112));
Selector selector = Selector.open();
listenChannel.configureBlocking(false);
listenChannel.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
if (selector.select(TIMEOUT) == 0) {
System.out.print(".");
continue;
}
Iterator<SelectionKey> it = selector.selectedKeys().iterator();
while (it.hasNext()) {
SelectionKey key = it.next();
it.remove();
if (key.isAcceptable()) {
SocketChannel channel = listenChannel.accept();
channel.configureBlocking(false);
SelectionKey connKey = channel.register(selector, SelectionKey.OP_ACCEPT);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
首先启动服务器,然后启动客户端,服务器将连接并引发异常,如下所示:
..................java.lang.IllegalArgumentException
at java.nio.channels.spi.AbstractSelectableChannel.register(AbstractSelectableChannel.java:199)
at java.nio.channels.SelectableChannel.register(SelectableChannel.java:280)
at NIOServer.main(myServer.java:32)
那么,当客户端连接时发生了什么?为什么寄存器函数抛出异常以及如何修复它?如果它在
通道中失败。寄存器(选择器,SelectionKey.OP_ACCEPT)
则必须将其更改为
channel.register(selector, SelectionKey.OP_READ);
只有ServerSocketChannel
支持SelectionKey.OP\u ACCEPT
listenChannel.accept()
创建支持读写操作的新通道 SocketChannel仅对OP_READ、OP_WRITE、OP_CONNECT具有有效选项。
请检查SocketChannel.validOps()但是先生,我实际上在使用服务器SocketChannel,就像在我的程序中一样。您的代码如下。SocketChannel通道=listenChannel.accept();信道配置阻塞(假);SelectionKey connKey=通道.寄存器(选择器,SelectionKey.OP_ACCEPT);频道是socketchannel类型的,但先生,我实际上使用的是服务器socketchannel,就像在我的程序中一样。@HindForsum您使用两个套接字频道。一个(
listenChannel
)是ServerSocketChannel
,但另一个(频道
)不是。它具有类型SocketChannelImpl
。
channel.register(selector, SelectionKey.OP_READ);