私の割り当てには、UDPサービスを使用して画像ファイルを送信することが含まれます(Javaを使用して、それを正常に実装しました)。私の教授は、以下を含めるように求めました:
「交換されたデータ メッセージには、送信側が受信側での重複フィルタリング用の 16 ビット メッセージ シーケンス番号を含めるためのヘッダー部分も必要です」
これを行う方法?
UDP パケットを作成すると仮定すると、ByteArrayOutputStream を使用してデータを生成しています。その場合は、DataOutputStream をその ByteArrayOutputStream の上にラップし、ストリームに画像データを書き込む前に writeInt(somesequenceNumber) を呼び出します。
受信側では逆のことを行い、ByteArrayInputStream を DataInputStream でラップし、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 は何らかのセットです
16 ビット値の場合、DataOutputStream.writeShort() と DataInputSTream readShort()/readUnsignedShort() を使用します。writeInt() と readInt() は 32 ビット値用です。重複を避けたい場合は、どのような場合でも 32 ビット値を選択することをお勧めします。;)