【问题标题】:DataInputStream over DatagramSocket数据报套接字上的数据输入流
【发布时间】:2016-07-04 04:56:59
【问题描述】:

我编写了一个可以接受来自 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 读取到其末尾。你不这样做吗?
  • 不,在我的情况下,它是以数据包的形式出现的比特流。如果新数据包在数据流中开始,它将在下一次运行中被擦除。所以我应该如何回读数据流的剩余部分并将其与新数据流的开始部分合并,以便重新获得我的数据包。
  • 在您发布的代码中,这些都不明显。如果您不将其读取到流的末尾,您将丢失任何输入流中的数据。这不是DataInputStreamByteArrayInputStream 的错。这是您代码中的错误,而且是您尚未发布的代码中的错误。

标签: java sockets udp datagram datainputstream


【解决方案1】:

简单。

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

其中packetDatagramPacket

【讨论】:

  • 谢谢!这正是我要寻找的。但是每当有新数据包到达时,我应该调用上述命令吗?
  • 我已经使用了上述命令,但是每次收到新数据包时我都会创建新的 din。这让我丢失了一些数据包。
  • @Anand 仅当您没有阅读前一个到流结束时。
猜你喜欢
  • 1970-01-01
  • 2021-04-10
  • 1970-01-01
  • 1970-01-01
  • 2014-11-18
  • 1970-01-01
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多