UDP数据包的长度写错了

时间:2017-02-03 15:26:48

标签: java udp multicast fileoutputstream bytebuffer

我编写的小程序接收UDP数据包并将其数据保存到文件中。

        MulticastSocket socket = getMulticastSocket(interfaceAddress, multicastAddress, port);
        FileOutputStream fos = null;
        try{
            fos = new FileOutputStream(fileName);
            while(true) {
                byte[] data = new byte[BUFFER_SIZE];
                byte[] lengthBytes = new byte[4];
                DatagramPacket packet = new DatagramPacket(data, 0, data.length);
                socket.receive(packet);
                int length = packet.getLength();
                ByteBuffer lengthBB = ByteBuffer.wrap(lengthBytes);
                lengthBB.putInt(length);
                fos.write(lengthBB.array());
                fos.flush();
                fos.write(data, 0, length);
                fos.flush();
            }
        }

之后我尝试阅读它使用以下代码

final FileInputStream inputStream = new FileInputStream(fileName);
byte[] length = new byte[4];
while (inputStream.read(length) != -1){
    int receivedLength = ByteBuffer.wrap(length).getInt();
    byte[] body = new byte[receivedLength];
    inputStream.read(body);
    // doing something with body
    length = new byte[4];
}

它通常有效但在文件中间我在receiveLength变量中得到负值(-2147483648和[-128,0,0,0]在字节表示中)。

BUFFER_SIZE = 10240但我不认为该包大于此值。

问题:为什么会这样?

P.S。我没有访问写入文件的机器,我无法查看网络流。我只有文件。

1 个答案:

答案 0 :(得分:0)

UDP消息的最大大小为64K。你说你不认为这个数据包大于10240但它可能是。尝试将缓冲区增加到64 * 1024,看看是否会改变结果。