2012-07-30 39 views
0

我通过TCP发送多个大小为< 500的字节数组。但是,在客户端,我有时会接收大小大于2000的数组。这是为什么发生?TCP连接:接收数组的大小意外巨大

下面是我的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; 

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

回答

1

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

如果你想使用它作为记录导向或框架协议,你必须添加自己的框架。你可以预先给你发送的数据添加一个大小,并且一次只能读取那么多的数据。

如果您的记录总是相同的长度,您可以做一个固定长度的读取。我不知道Java的库,但你应该能够提供read()的长度。

+0

谢谢。我想我只是要使用ObjectInputStream和ObjectOutputStream来代替。 – 2012-07-31 17:10:58

+0

这可能比自己实现它更容易。 :) – Max 2012-07-31 17:12:34

1

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

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

1

基本上你看到的是多个阵列组合在一起被同时接收。在阵列前发送数组长度并读取许多字节。