UDP клиент / сервер.... включает 16-битный порядковый номер сообщения для фильтрации дубликатов

Мое задание включает в себя отправку файла изображения с использованием сервиса UDP (с помощью Java, который я успешно реализовал). Мой профессор попросил включить:

"Сообщения обмениваемых данных также должны иметь часть заголовка, чтобы отправитель включал 16-битный порядковый номер сообщения для дублирующейся фильтрации на стороне получателя"

Как это сделать?

2 ответа

Я предполагаю, что для создания вашего UDP-пакета вы используете ByteArrayOutputStream для генерации данных. Если это так, просто оберните DataOutputStream поверх этого ByteArrayOutputStream и вызовите 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 - это некоторый набор

Для 16-битного значения я бы использовал DataOutputStream.writeShort() и DataInputSTream readShort()/readUnsignedShort(). writeInt() и readInt () предназначены для 32-битных значений. Если вы хотите избежать дублирования, 32-битное значение может быть лучшим выбором в любом случае.;)

Другие вопросы по тегам