1

私の割り当てには、UDPサービスを使用して画像ファイルを送信することが含まれます(Javaを使用して、それを正常に実装しました)。私の教授は、以下を含めるように求めました:

「交換されたデータ メッセージには、送信側が受信側での重複フィルタリング用の 16 ビット メッセージ シーケンス番号を含めるためのヘッダー部分も必要です」

これを行う方法?

4

2 に答える 2

3

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 は何らかのセットです

于 2011-03-20T03:39:26.307 に答える
1

16 ビット値の場合、DataOutputStream.writeShort() と DataInputSTream readShort()/readUnsignedShort() を使用します。writeInt() と readInt() は 32 ビット値用です。重複を避けたい場合は、どのような場合でも 32 ビット値を選択することをお勧めします。;)

于 2011-03-20T08:07:34.450 に答える