0

Java NIO を使用してクライアント サーバー Java プログラムを実行しています。基本的にサーバーコードについては、ここから取得しました。そして、クライアント側については、ここから取得しました。今は良さそうです。私が今達成したいのは、クライアントからサーバーにデータを送信し、サーバーがクライアントに送り返すことです。

しかし、私はロジックに問題があります。「AMessage」を入力すると、サーバーから「AMessage」を取得するために「BMessage」を入力する必要があります。私はデバッグを行いましたが、key.isConnectable()常に returnのようtrueです。キーインタレストを設定して再登録しようとしましたが、まだ解決策が見つかりませんでした。

これを試してみましたがkey.interestOps(0);myChannel.register(selector, SelectionKey.OP_READ);何も起こらないようです。isConnectableまだtrueを返しました。ローカルホストの問題であると他の人から報告されたいくつかの問題を見つけました。何も思いつきません。しかし、今はサーバーとクライアントを localhost で実行しています。誰でも何か考えがありますか?

ありがとう :)

編集:これは私のコードの一部です:-

if (key.isConnectable()) {
if (myChannel.isConnectionPending()) {
    try{
        myChannel.finishConnect();
    }
    catch(IOException e){
        System.out.println(e);
    }
    System.out.println("Status of finishCOnnect(): " + myChannel.finishConnect() );
    System.out.println("Connection was pending but now is finished connecting.");
}

    ByteBuffer bb = null;
    ByteBuffer incomingBuffer = null;

    Scanner input = new Scanner(System.in);  // Declare and Initialize the Scanner

    while (true) {

        System.out.println("Status isReadable is " + key.isReadable() + " and isWritable is " + key.isWritable() + 
                                            " and isConnectable is " + key.isConnectable());

        readMessage(key); //read if server send data


        //send data to server here
        String inputFromClient = input.nextLine(); //Get the input from client

        System.out.println("debugging after get input...");

        bb = ByteBuffer.allocate(inputFromClient.length()); //Allocate buffer size according to input size

        byte[] data = inputFromClient.getBytes("UTF-8"); //convert the input to form of byte
        bb = ByteBuffer.wrap(data); //wrap string inside a buffer

        myChannel.write(bb); //Write the buffer on the channel to send to the server
        bb.clear();

        }

    }
4

1 に答える 1

4
if (key.isConnectable()) {
if (myChannel.isConnectionPending()) {
    try{
        myChannel.finishConnect();
    }
    catch(IOException e){
        System.out.println(e);
    }
    System.out.println("Status of finishCOnnect(): " + myChannel.finishConnect() );
    System.out.println("Connection was pending but now is finished connecting.");
}

ここにはいくつかの問題があります。

  1. isConnectionPending()テストは冗長です。それは保留中である必要があります。そうでなければ、イベントを取得できませんでしたが、それをテストしてプロビデンスを誘惑している可能性があります。このテストを取り除きます。

  2. finishConnect()あなたは電話で正しいことをしていません。finishConnect()true が返され場合は、登録解除OP_CONNECTして登録しても問題ありOP_READません。false を返す場合は、OK ではありません。

  3. が例外をスローする場合finishConnect()、接続は失敗しているため、チャネルを閉じる必要があります。

  4. ブロック内で 1 回、状態をログに記録するときに 1 回ですfinishConnect()try2 番目の呼び出しを取り除き、最初の呼び出しの結果があればそれを使用します。これを再編成して、(a) からの成功finishConnect()、(b) からの失敗finishConnect()、および (c) からの例外をfinishConnect()すべて別々に記録します。

  5. あなたのファイナルSystem.out.println()は、3 つのケースのうち 2 つのケースでただの嘘です。真実かどうかわからないことを自分に言い聞かせないでください。それは絵を混乱させるだけです。上記のように、各ケースを個別に記録します。

  6. テストではなく、接続が読み取り可能であると想定していますisReadable().

于 2013-03-28T08:50:43.193 に答える