0
    SocketChannel channel = (SocketChannel) key.channel();

    ByteBuffer buffer = ByteBuffer.allocate(1024);
    int numRead = -1;
    try {
        numRead = channel.read(buffer);
        System.out.println("numRead: " + numRead);
    }
    catch (IOException e) { e.printStackTrace();}
    if (numRead == -1) {
        this.dataMap.remove(channel);
        Socket socket = channel.socket();
        SocketAddress remoteAddr = socket.getRemoteSocketAddress();
        System.out.println("Connection closed by client: " + remoteAddr);
        channel.close();
        key.cancel();
        return;
    }
    System.out.println("Got: " + new String(buffer.array(), "windows-1251"));

ソケットから1024バイトのデータを読み取ります。この場合、すべてのメッセージが結合され、最後のメッセージが完全に届きません。メッセージセパレータ'|'の前のバッファにデータを読み込むにはどうすればよいですか??各メッセージを個別に受信したい。

4

2 に答える 2

0

プロトコルによって異なりますが、プロトコルがメッセージ区切り文字に基づいている場合、唯一のオプションは、ブロックせずにできるだけ多くを読み取り、読み取ったコンテンツをスキャンして区切り文字を見つけることです。接続が閉じられるまで (または、あなたの側が接続を閉じることを決定するまで) ループでこれを行う必要があります。

もちろん、一度に複数のメッセージを読むことも、メッセージの一部を読むこともできるので、これらのケースを適切に処理する必要があります。

于 2012-06-28T17:47:21.767 に答える
0

TCP にはメッセージのようなものはありません。これはバイトストリーム API です。メッセージが必要な場合は、セパレーター、STX/ETX ペア、長さの単語のプレフィックス、自己記述型プロトコルなどを介して、自分で実装する必要があります。

于 2012-06-28T22:07:16.950 に答える