Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java发送/接收UDP数据包内部缺少数据_Java_Sockets_Udp - Fatal编程技术网

Java发送/接收UDP数据包内部缺少数据

Java发送/接收UDP数据包内部缺少数据,java,sockets,udp,Java,Sockets,Udp,我正在实现一个p2p应用程序,其中节点通过UDP数据包进行通信。从InputStream读取的数据包有时不完整 这是我的密码: 例如,读取的数据包有时已完成 concat:1791366782544:140737488355328 但有些时候是不完整的,例如 concat:1791366782544 concat:1791366782544 concat:1791366782544 有人能告诉我问题出在哪里吗 非常感谢 下面是发送/接收UDP数据包的代码 发送: 私有无效发送消息(int c

我正在实现一个p2p应用程序,其中节点通过UDP数据包进行通信。从InputStream读取的数据包有时不完整

这是我的密码:

例如,读取的数据包有时已完成

concat:1791366782544:140737488355328

但有些时候是不完整的,例如

concat:1791366782544 concat:1791366782544 concat:1791366782544

有人能告诉我问题出在哪里吗

非常感谢

下面是发送/接收UDP数据包的代码 发送:

私有无效发送消息(int comm、消息消息、InetAddress ip、int端口) 抛出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);

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);