1

リモートサーバーに接続して、スレッドでログインメッセージを送信しようとしています:

@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

この loginServer() メソッドを送信する前に、接続を確認して待機するにはどうすればよいですか?

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 に答える