Java发送/接收UDP数据包内部缺少数据
我正在实现一个p2p应用程序,其中节点通过UDP数据包进行通信。从InputStream读取的数据包有时不完整 这是我的密码: 例如,读取的数据包有时已完成 concat:1791366782544:140737488355328 但有些时候是不完整的,例如 concat:1791366782544 concat:1791366782544 concat:1791366782544 有人能告诉我问题出在哪里吗 非常感谢 下面是发送/接收UDP数据包的代码 发送: 私有无效发送消息(int comm、消息消息、InetAddress ip、int端口) 抛出IOException{Java发送/接收UDP数据包内部缺少数据,java,sockets,udp,Java,Sockets,Udp,我正在实现一个p2p应用程序,其中节点通过UDP数据包进行通信。从InputStream读取的数据包有时不完整 这是我的密码: 例如,读取的数据包有时已完成 concat:1791366782544:140737488355328 但有些时候是不完整的,例如 concat:1791366782544 concat:1791366782544 concat:1791366782544 有人能告诉我问题出在哪里吗 非常感谢 下面是发送/接收UDP数据包的代码 发送: 私有无效发送消息(int c
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);
UDP不提供损坏或部分数据包。可能是您没有发送所有数据,也可能是您没有正确解包。您仍然没有发布所有相关代码,因此无法准确说出具体位置。这里没有证据表明您正在使用UDP。代码的UDP部分在哪里?请编辑问题中的代码。您是否尝试在关闭前刷新输出流中的数据?您将传入的
DatagramPacket
转换为流的部分在哪里?@nhahtdh输出流在关闭时自行刷新,请参阅Javadoc。谢谢EJP!我的应用程序中有两种类型的数据包使用相同的消息代码(我复制/粘贴以创建新的消息类型,但忘记更改消息代码)。因此,在一种情况下正确读取数据包,在另一种情况下失败。
byte[] buffer = new byte[DATAGRAM_BUFFER_SIZE];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
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);