我在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),但校验和是错误的。
请注意,代码不是整个事物,只是影响输出的部分。任何帮助将不胜感激。
答案 0 :(得分:0)
我相信你的问题在于你认为你的数据包会在一个块中到达,但是Streams可以将数据切割成切片。
在输出中,您必须封装数据以了解您的起点和停止位置。
在输入处,您必须按块重建缓冲区块,直到找到“结束标记”。
您使用的是ObjectStream吗?如果是这样,请注意他们通过流发送和接收自己的标识符。它可以解释缺少的8个字节。