【问题标题】:TCP connection: received array's size is unexpectedly hugeTCP 连接:接收到的数组的大小出乎意料地大
【发布时间】:2012-07-31 07:33:17
【问题描述】:

我正在通过 TCP 发送大小 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 tcpclient


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢。我想我只是要使用 ObjectInputStream 和 ObjectOutputStream 来代替。
    • 这可能比自己实现要容易。 :)
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2014-09-19
        • 1970-01-01
        • 2011-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-14
        • 1970-01-01
        • 2019-12-28
        相关资源
        最近更新 更多