簡體   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