Java DatagramSocket上的DataInputStream

Java DatagramSocket上的DataInputStream,java,sockets,udp,datagram,datainputstream,Java,Sockets,Udp,Datagram,Datainputstream,我已经编写了一个通用程序,可以接受来自DataInputStream的数据。但最近我尝试使用DatagramSocket从UDP接收数据。我搜索了很多,但是我找不到一种方法来处理从DatagramSocket到DataInputStream的传入数据。从逻辑上讲,因为两者都是传入数据,所以应该有一种方法来集成这两个对象,对吗?我错了吗 在得到EJP的答复后,我现在使用的是这样的,对吗 byte[] buffer = new byte[2048]; DatagramPacket packet =

我已经编写了一个通用程序,可以接受来自DataInputStream的数据。但最近我尝试使用DatagramSocket从UDP接收数据。我搜索了很多,但是我找不到一种方法来处理从DatagramSocket到DataInputStream的传入数据。从逻辑上讲,因为两者都是传入数据,所以应该有一种方法来集成这两个对象,对吗?我错了吗

在得到EJP的答复后,我现在使用的是这样的,对吗

byte[] buffer = new byte[2048];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
DataInputStream dis = new DataInputStream(new ByteArrayInputStream(packet.getData(), packet.getOffset(), packet.getLength()));
While(true){
    dsocket.receive(packet);
    dis = new DataInputStream(new ByteArrayInputStream(packet.getData(), packet.getOffset(), packet.getLength()));
    reader = new MAVLinkReader(dis,MAVLinkMessage.MAVPROT_PACKET_START_V10);
    mesg = reader.getNextMessage();
    while (mesg != null) {...do stuff...}
}
现在我感觉到的是,由于每次读卡器初始化到新的dis时,dis中以前剩余的字节都消失了。

很容易

DataInputStream din = new DataInputStream(new ByteArrayInputStream(packet.getData(), packet.getOffset(), packet.getLength());

其中
数据包
数据包

谢谢!这正是我要找的。但是,每当一个新数据包到达时,我应该调用上面的命令吗?我已经使用了上面的命令,但是每次收到新数据包时,我都会创建新的din。这使我失去了一些数据包的碎片。@Anand只有在你们并没有读到流末的前一个数据包的情况下,它们当然已经消失了。你期待什么?在读取另一个数据包之前,需要将DataInputStream读取到底。你不是在这样做吗?不,在我的例子中,它是以数据包的形式出现的比特流。如果在数据流中启动一个新数据包,它将在下一次运行中被擦除。因此,我应该如何读回datastram的剩余部分,并将其与新数据流的开始部分合并,以便重新获取我的数据包。在您发布的代码中,这些都不明显。若不将任何输入流中的数据读取到流的末尾,则会丢失数据。这不是
DataInputStream
ByteArrayInputStream
的故障。这是您代码中的一个bug,而且是您尚未发布的代码中的一个bug。