TCP连接:收到的数组大小意外巨大

时间:2012-07-30 23:27:52

标签: tcp tcpclient

我通过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;

任何帮助表示赞赏!谢谢!

3 个答案:

答案 0 :(得分:1)

TCP没有任何消息边界的概念,因为它是协议。它可以(并且将会)将多个发送合并到一个接收中,甚至相反 - 将发送分成多个较小的接收。

您的申请必须为此做好准备。

答案 1 :(得分:1)

TCP不是面向记录的协议。它是面向流的。这意味着可以在另一侧接收之前重新组合数据包。可能,这意味着您已经收到了3到4组数据,并且正在一次处理它们。

如果您希望将其用作面向记录或框架的协议,则必须自行添加框架。您可以为发送的数据预先添加大小,并且一次只能读取那么多数据。

如果您的记录长度始终相同,则可以进行固定长度的读取。我不知道Java的库,但你应该能够提供read()的长度。

答案 2 :(得分:1)

基本上你所看到的是同时接收多个阵列背靠背组合。在数组之前发送数组长度并读取那么多字节。