TCP连接:接收阵列';它的大小出人意料地巨大

TCP连接:接收阵列';它的大小出人意料地巨大,tcp,tcpclient,Tcp,Tcpclient,我正在发送大小为2000的多字节数组。为什么会这样 以下是我的TCPClient代码: byte[] receiveData = new byte[64000]; DataInputStream input = new DataInputStream(socket.getInputStream()); int size = input.read(receiveData); byte[] receiveDataNew

我正在发送大小为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;

感谢您的帮助!谢谢大家!

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


您的应用程序必须为此做好准备。

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


您的应用程序必须为此做好准备。

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

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


如果记录的长度始终相同,则可以执行固定长度读取。我不知道Java的库,但您应该能够提供读取长度()。它是面向流的。这意味着数据包可以在另一端接收之前重新组合。很可能,这意味着您已经收到了3或4组数据数组,并且正在同时处理它们

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


如果记录的长度始终相同,则可以执行固定长度读取。我不知道Java的库,但您应该能够提供读取的长度()。在数组之前发送数组长度,并读取那么多字节

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

多谢各位。我想我只是打算用ObjectInputStream和ObjectOutputStream来代替。这可能比自己实现要容易。:)非常感谢。我想我只是打算用ObjectInputStream和ObjectOutputStream来代替。这可能比自己实现要容易。:)