0

TCP 経由でサイズが 500 未満の複数のバイト配列を送信しています。ただし、クライアント側では、サイズが 2000 を超える配列を受け取ることがあります。なぜこうなった?

以下は、TCPClient の私のコードです。

       byte[] receiveData = new byte[64000];            
       DataInputStream input = new DataInputStream(socket.getInputStream());
       int size = input.read(receiveData);
       byte[] receiveDataNew = new byte[size];
       System.arraycopy(receiveData,0,receiveDataNew,0,size);
       System.out.println("length of receiveData is " + size);
       GenericRecord result = AvroByteReader.readAvroBytes(receiveDataNew);
       return result;

どんな助けでも大歓迎です!ありがとうございました!

4

3 に答える 3

1

TCP はストリームプロトコルであるため、メッセージ境界の概念はありません。複数の送信を 1 つの受信にマージできます (また、マージすることもできます)。逆に、送信を複数の小さな受信に分割することもできます。

アプリケーションは、これに備えて準備する必要があります。

于 2012-07-30T23:30:53.670 に答える
1

TCP はレコード指向のプロトコルではありません。ストリーム指向です。これは、相手側で受信する前にパケットを再結合できることを意味します。おそらく、これは 3 つまたは 4 つのデータ配列セットを受け取り、それらすべてを一度に処理していることを意味します。

レコード指向またはフレーム化されたプロトコルとして使用する場合は、そのフレーム化を自分で追加する必要があります。送信するデータの先頭にサイズを追加して、一度にそれだけの量のデータのみを読み取ることができます。

レコードが常に同じ長さである場合は、固定長の読み取りを実行できます。Java のライブラリはわかりませんが、read() の長さを指定できるはずです。

于 2012-07-30T23:31:14.913 に答える
1

基本的に、あなたが見ているのは、同時に受信されている背中合わせに結合された複数のアレイです。配列の前に配列の長さを送信し、そのバイト数を読み取ります。

于 2012-07-30T23:33:17.810 に答える