java - UDP 客户端/服务器 ....包括用于过滤重复项的 16 位消息序列号

标签 java udpclient

我的作业包括使用 UDP 服务发送图像文件(使用我成功实现的 java)。我的教授要求包括:

"The exchanged data messages must also have a header part for the sender to include 16-bit message sequence number for duplicate filtering at the receiver end"

如何做到这一点?

最佳答案

我假设要创建您的 UDP 数据包,您正在使用 ByteArrayOutputStream 来生成数据。如果是这种情况,只需在该 ByteArrayOutputStream 之上包装一个 DataOutputStream,然后在将图像数据写入流之前调用 writeInt(somesequenceNumber)。

在接收端,做相反的事情,将一个 DataInputStream 包裹在一个 ByteArrayInputStream 周围,然后调用 readInt() 来获取序列号。从那里你可以检查你是否已经收到这个数据包。

有点像

书写面

ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);

dos.writeInt(sequenceNumber++);
dos.writeInt(imageDataLength);
dos.write(imageData);

dos.flush();

byte[] udpPacketBytes = baos.toByteArray();

阅读面

ByteArrayInputStream bais = new ByteArrayInputStream(udpPacketBytes);
DataInputStream dis = new DataInputStream(bais);
int sequenceNumber = dis.readInt();
if (seenSequenceNumbers.add(Integer.valueOf(sequenceNumber)))
{
    int imageLength = dis.readInt();
    byte[] imageData = new byte[imageLength];
    dis.read(imageData);
}

seenSequenceNumbers 是某个集合

关于java - UDP 客户端/服务器 ....包括用于过滤重复项的 16 位消息序列号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5366566/

相关文章:

java - 在将消息推送到 SQS 时提供请求超时

java - 通过工厂方法实例化 Bean 失败;异常 org.springframework.beans.BeanInstantiationException

networking - UDP 打洞 : one Symmitric and another non-symmetric NAT

c# - 获取我们收到 UDP 多播请求的 IP 地址

c - UDP客户端连接过程正确,Unix环境下传输失败

java - Android - 在 Chronometer 中计算耗时

java - 如何在gradle中执行或构建子项目之前执行任务?

java - 如何创建一个 Java 方法来解析一个大的 JSON 文件

c++ - 包含 <boost/asio.hpp> 后无法运行程序

c# - 我如何知道 UdpClient 是否已关闭/处置?