1

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

“交换的数据消息还必须有一个标头部分,以便发送方包含 16 位消息序列号,以便在接收端进行重复过滤”

这个怎么做?

4

2 回答 2

3

我假设要创建您的 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

于 2011-03-20T03:39:26.307 回答
1

对于 16 位值,我将使用 DataOutputStream.writeShort() 和 DataInputSTream readShort()/readUnsignedShort()。writeInt() 和 readInt() 用于 32 位值。如果您想避免重复,则 32 位值在任何情况下都可能是更好的选择。;)

于 2011-03-20T08:07:34.450 回答