Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/13.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
JavaNIO连接到套接字_Java_Nio - Fatal编程技术网

JavaNIO连接到套接字

JavaNIO连接到套接字,java,nio,Java,Nio,我正在尝试连接到远程服务器并在我的线程中发送登录消息: @Override public void run() { try { address = new InetSocketAddress(host, port); incomingMessageSelector = Selector.open(); socketChannel = SocketChannel.open(); socketChannel

我正在尝试连接到远程服务器并在我的线程中发送登录消息:

@Override
public void run() {
    try {
        address = new InetSocketAddress(host, port);
        incomingMessageSelector = Selector.open();
        socketChannel = SocketChannel.open();           
        socketChannel.configureBlocking(false);
        socketChannel.connect(address);
        socketChannel.register(incomingMessageSelector, SelectionKey.OP_READ);
        serverManager.loginToServer();
    }
}
loginServer是一种向其他服务器发送消息的方法,但我一直收到以下消息:

java.nio.channels.NotYetConnectedException

在发送此登录服务器方法之前,如何检查并等待连接?

我找到了答案。。我应该使用:

    socketChannel = SocketChannel.open(address);            
    socketChannel.configureBlocking(false);

    while (!socketChannel.finishConnect());

   //my code after connection

由于NIO处于非阻塞模式,我们必须等待它完成连接

我找到了答案。。我应该使用:

    socketChannel = SocketChannel.open(address);            
    socketChannel.configureBlocking(false);

    while (!socketChannel.finishConnect());

   //my code after connection

由于NIO处于非阻塞模式,我们必须等待它完成连接

如果以非阻塞模式连接,则应:

注册OP_CONNECT的通道 当它触发时,请调用finishConnect 如果返回true,则取消注册OP_CONNECT并注册OP_READ或OP_WRITE,具体取决于接下来要执行的操作 如果返回false,则不执行任何操作,继续选择 如果connect或finishConnect引发异常,请关闭通道并重试,或者忘记它,或者告诉用户或任何适当的信息。
如果在通道连接之前不想执行任何操作,请在阻塞模式下进行连接,并在连接成功时进入非阻塞模式。

如果在非阻塞模式下进行连接,则应:

注册OP_CONNECT的通道 当它触发时,请调用finishConnect 如果返回true,则取消注册OP_CONNECT并注册OP_READ或OP_WRITE,具体取决于接下来要执行的操作 如果返回false,则不执行任何操作,继续选择 如果connect或finishConnect引发异常,请关闭通道并重试,或者忘记它,或者告诉用户或任何适当的信息。
如果在通道连接之前您不想做任何事情,请在阻塞模式下进行连接,并在连接成功时进入非阻塞模式。

我建议您首先使用阻塞NIO实现。它更简单,可以做你想做的事。注意:在NIO中,默认行为是阻塞。我建议您首先使用阻塞NIO实现。它更简单,可以做你想做的事。注意:在NIO中,默认行为是阻塞。这是毫无意义的。只需在阻塞模式下进行连接,避免占用CPU。或者注册OP_CONNECT并在其启动时使用select并调用finishConnect。这是毫无意义的。只需在阻塞模式下进行连接,避免占用CPU。或者注册OP_CONNECT,并在触发时使用select和call finishConnect。