我正在实现一个p2p应用程序,其中节点通过UDP数据包进行通信。从InputStream读取的数据包有时不完整。
这是我的代码:
...
protected String key;
protected Identifier messId; //Identifier hold a BigInteger
protected String range;
protected String concat;
...
public ReplicationMessage(DataInput in) throws IOException {
fromStream(in);
}
public void fromStream(DataInput in)
try {
super.fromStream(in);
int length=in.readInt();
byte[] data=new byte[length];
in.readFully(data);
concat = new String(data);
System.out.println("concat: "+concat);
messId = new Identifier(in);
} catch (IOException e) {
e.printStackTrace();
}
}
public void toStream(DataOutput out) {
try {
super.toStream(out);
byte[] data = concat.getBytes();
out.writeInt(data.length);
out.write(data);
messId.toStream(out);
} catch (IOException e) {
e.printStackTrace();
}
}
有时读取数据包已完成,例如
concat:179136678282544:140737488355328
但有时并不完整,例如
concat:179136678282544 concat:179136678282544 concat:179136678282544
任何人都可以告诉我这是什么问题吗?
非常感谢
以下是发送/接收UDP数据包的代码 发送:
private void sendMessage(int comm,Message message,InetAddress ip,int port) 抛出IOException {
ByteArrayOutputStream bout = new ByteArrayOutputStream();
DataOutputStream dout = new DataOutputStream(bout);
dout.writeInt(comm);
dout.writeByte(message.code());
message.toStream(dout);
dout.close();
byte[] data = bout.toByteArray();
if (data.length > DATAGRAM_BUFFER_SIZE) {
throw new IOException("Message too big, size="+data.length+
" bytes, max="+DATAGRAM_BUFFER_SIZE+" bytes");
}
DatagramPacket packet = new DatagramPacket(data, data.length, ip, port);
socket.send(packet);
}
用于接收UDP数据包
byte[] buffer = new byte[DATAGRAM_BUFFER_SIZE];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
属于一台机器的发送节点和接收节点。缓冲区接收数据包设置为10 * 1024字节,远大于数据包长度
以下是将传入数据包转换为流
的代码 ByteArrayInputStream bin = new ByteArrayInputStream(packet.getData(),
packet.getOffset(), packet.getLength());
DataInputStream din = new DataInputStream(bin);
int comm = din.readInt();
byte messCode = din.readByte();
Message message = factory.createMessage(messCode, din);
答案 0 :(得分:0)
UDP不会传送损坏或部分数据包。要么您没有发送所有数据,要么您没有正确打开包装。你还没有发布所有相关的代码,所以不可能确切地说明在哪里。