Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java nio Channel.register抛出IllegalArgumentException_Java_Sockets_Server_Nio_Channel - Fatal编程技术网

Java nio Channel.register抛出IllegalArgumentException

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

我正在尝试java nio的套接字服务器通道和选择器,如下所示:

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);