我的任务包括使用 UDP 服务发送图像文件(使用我成功实现的 java)。我的教授要求包括:
“交换的数据消息还必须有一个标头部分,以便发送方包含 16 位消息序列号,以便在接收端进行重复过滤”
这个怎么做?
我假设要创建您的 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 是一些 Set
对于 16 位值,我将使用 DataOutputStream.writeShort() 和 DataInputSTream readShort()/readUnsignedShort()。writeInt() 和 readInt() 用于 32 位值。如果您想避免重复,则 32 位值在任何情况下都可能是更好的选择。;)