【问题标题】:send a big byte array through java socket通过java套接字发送一个大字节数组
【发布时间】:2014-10-05 16:41:53
【问题描述】:

我有一个长度超过 1200000 的大字节数组。我想通过 DataOutputStream 发送它,并通过 DataInputStream 在客户端接收。

我正在使用代码

    out.write(outData)

    in.readFully(inData)

out是DataOutputStream,in是DataInputStream,outData是我要发送的字节数组。 当我运行程序时,如果字节数组的长度在120000左右,可以发送数组,但是当长度变为1200000时,服务器就收不到数组了。我应该把大数组分成几个小数组吗?

我在下面尝试了这样的代码,但它仍然无法正常工作。

        out.writeInt(outData.length);

        int start = 0;
        int len = 0;
        int count = outData.length;

        while (count > 0) {
            if (count < 4096) 
                len = count;
            else len = 4096;

            out.write(outData, start, len);
            start += len;
            count -= len;
        }

        int length=in.readInt();
        byte[] inData=new byte[length];
        in.readFully(inData);

有人可以帮忙吗?谢谢。

【问题讨论】:

  • 您可以使用socket.write() 发送任意大小的内容,而不必自己缓存 Java 会为您执行此操作。但是接收是另一回事,它会随机出现,您必须有某种标识符来自己切割数据包,否则它将只是一个漫长的永无止境的数据包。
  • 不,您不应该这样做。贴出代码,详细说明“服务器无法接收数组”。告诉我们准确地会发生什么。
  • 你使用什么协议? TCP 还是 UDP?
  • 您可以使用 {SOH}[message bytes]{ETX} 对字节进行构图,然后在接收端读取从 SOH -> ETX 开始的缓冲区,然后停止从接收到的构造对象字节。
  • 我使用的是 TCP 协议,我使用 in.readFully(inData) 在接收端截断消息不好吗?

标签: java sockets


【解决方案1】:

作者:

for(int i=0;i<length;i++){ dataoutputstream.writeByte(bytearray[i]); }

在阅读器中:

for(int i=0;i<length;i++){ bytearray[i]=datainputstream.readByte(); }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 2012-08-29
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多