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-битное значение может быть лучшим выбором в любом случае.;)