使用bytebuffer发送Java数据包

时间:2015-10-15 12:35:47

标签: java sockets networking udp packet

我在java中发送数据报包时遇到了一些问题。我的部分代码如下。

发信人:

    String str = "abcdefghijk.txt"
    byte[] data = new byte[1000];
    ByteBuffer buf = ByteBuffer.wrap(data);
    buf.put(str.getBytes());
    //data = str.getBytes();     line 1

    //checksum
    crc.reset();
    crc.update(data, 8, data.length-8);
    checksum = crc.getValue();

    buf.rewind();
    buf.putLong(checksum);

    packet = new DatagramPacket(data, data.length, address);        

接收器:

      packet.setLength(data.length);
      socket.receive(packet);
      data = packet.getData();   
      str = new String(data);  
      str = str.trim();

      buf.rewind();
      checksum = buf.getLong();
      crc.reset();
      crc.update(data, 8, packet.getLength()-8);

然后我将使用checksum == crc.getValue()进行检查。如果我按原样运行代码,我的校验和是有效的,但收到的str将是这样的 - > @#$%ijk.txt(垃圾值面前)。在这种情况下,前8个字符消失了,我认为这与getLong()有关。

但是如果我在我的代码中使用第1行,收到的str是正确的(abcdefghijk.txt),但校验和是错误的。

请注意,代码不是整个事物,只是影响输出的部分。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我相信你的问题在于你认为你的数据包会在一个块中到达,但是Streams可以将数据切割成切片。

在输出中,您必须封装数据以了解您的起点和停止位置。

在输入处,您必须按块重建缓冲区块,直到找到“结束标记”。

您使用的是ObjectStream吗?如果是这样,请注意他们通过流发送和接收自己的标识符。它可以解释缺少的8个字节。