1

BufferedOutputStream を使用して個別のメッセージを送信したいと考えています。だから私はそうしますbos.write(msg1); bos.flush(); bos.write(msg2); bos.flush()。一方、これらのメッセージの分離に依存する BufferedReader があります。

BufferedReader br = new BufferedReader(new InputStreamReader(server.getInputStream()));
InputStream is = server.getInputStream();
while (true) {
    if (br.ready()) {
        byte[] bytes = new byte[is.available()];
        is.read(bytes);
    }
}

しかし、私が得るのは、「クライアントに 30 バイトを送信しています。クライアントに 30 バイトを送信しています」と、反対側では「60 バイトを受信しました」のようなものです。

4

2 に答える 2

2

あなたが言及した動作は、からではなくTCPからのBufferedOutputStreamものです。その理由は、TCPにはメッセージのようなものがないため、書き込みサイズと読み取りサイズの間の対応が保証されていないためです。これはバイト ストリーム プロトコルです。メッセージ境界が必要な場合は、自分で指定する必要があります。

ready()andをそのように使用しないでくださいavailable()。固定サイズのバッファとブロックを使用するだけです。

于 2015-07-18T20:02:03.343 に答える
0

これは私の問題を解決するのに役立ちました: http://www.codeproject.com/Articles/11922/Solution-for-TCP-IP-client-socket-message-boundary

私が今基本的に行っていることは、最初にペイロードの長さをチェックし、これを使用してメッセージの境界を決定することです。その後、他のメッセージを続行できます。

于 2015-07-19T22:25:40.800 に答える