2015-10-15 70 views
0

我在用java發送數據報包時遇到了一些問題。我有我的部分代碼在下面。用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); 

我會然後通過使用校驗和做一次檢查== crc.getValue()。如果我按照原樣運行代碼,我的校驗和是有效的,但是接收到的str會像這樣 - > @#$%ijk.txt(垃圾值infront)。在這種情況下,前8個字符不見了,我認爲這與getLong()有關。

但是,如果我在我的代碼中使用第1行,接收到的字符串是正確的(abcdefghijk.txt),但校驗和將是錯誤的。

請注意,代碼不是整個事物,而只是影響輸出的部分。任何幫助將不勝感激。

回答

0

我相信你在這裏的問題是你認爲你的數據包將會到達一個塊,但Streams有屬性將數據切成片。

在輸出上,您必須封裝數據以知道您的起始位置和停止位置。

在輸入處,您必須按塊重建緩衝區塊,直到找到'結束標記'。

你在使用ObjectStreams嗎?如果是這樣,請注意他們通過流發送和接收他們自己的標識符。它可以解釋缺少的8個字節。