繁体   English   中英

带字节缓冲区的Java数据包发送

[英]Java packet sending with bytebuffer

我在用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),但校验和将是错误的。

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

我相信这里的问题是您认为您的数据包将以一个块的形式到达,但是Streams具有将数据切成片的属性。

在输出上,您必须封装数据才能知道从哪里开始和从哪里停止。

在输入时,必须逐块重建缓冲区,直到找到“结束标记”为止。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM