2015-10-15 72 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个字节。