我通过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;
任何帮助表示赞赏!谢谢!
答案 0 :(得分:1)
TCP没有任何消息边界的概念,因为它是流协议。它可以(并且将会)将多个发送合并到一个接收中,甚至相反 - 将发送分成多个较小的接收。
您的申请必须为此做好准备。
答案 1 :(得分:1)
TCP不是面向记录的协议。它是面向流的。这意味着可以在另一侧接收之前重新组合数据包。可能,这意味着您已经收到了3到4组数据,并且正在一次处理它们。
如果您希望将其用作面向记录或框架的协议,则必须自行添加框架。您可以为发送的数据预先添加大小,并且一次只能读取那么多数据。
如果您的记录长度始终相同,则可以进行固定长度的读取。我不知道Java的库,但你应该能够提供read()的长度。
答案 2 :(得分:1)
基本上你所看到的是同时接收多个阵列背靠背组合。在数组之前发送数组长度并读取那么多字节。