1

I'm trying to connect to a remote server and send a login message in my Thread:

@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();
    }
}

the loginServer() is a method which send a message to ther server but i keep getting an:

java.nio.channels.NotYetConnectedException

how can i check and wait for connection before sending this loginServer() method?

4

2 回答 2

11

如果您在非阻塞模式下连接,您应该:

  • 注册频道OP_CONNECT
  • 当它触发呼叫时finishConnect()
  • 如果返回 true,请取消注册OP_CONNECT并注册OP_READ,或者OP_WRITE取决于您接下来要执行的操作
  • 如果它返回false,什么都不做,继续选择
  • 如果其中一个connect()finishConnect()抛出异常,请关闭通道并重试或忘记它或告诉用户或任何适当的东西。

如果您在通道连接之前不想做任何事情,请在阻塞模式下进行连接,并在连接成功时进入非阻塞模式。

于 2012-11-13T07:27:02.313 回答
0

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

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

    while (!socketChannel.finishConnect());

   //my code after connection

因为 NIO 处于非阻塞模式,我们必须等到它完成连接

于 2012-11-12T16:30:26.487 回答