Отправка нескольких данных в одной UDP-датаграмме

Я работаю над заданием по сетевому программированию о написании простой системы обмена мгновенными сообщениями (почти как в самой простой версии Windows Messenger).

спецификация указывает, что я должен отправить более 4 полей данных в одном пакете дейтаграммы, это:

To From Type Message
where type refers to message type, implemented as a user defined enum class.

Я хотел бы научить, как упаковать все эти данные в один пакет.

ОБНОВЛЕНИЕ: спасибо за помощь до сих пор, но говорят, что у меня есть строковое предложение и строковое значение. При обычном способе индивидуального исправления пакета будет

byte[] sendData = new byte [256]
sendData = sentence.getBytes();

но как именно я могу добавить строку "from" в sendData вместе со строкой предложения?

4 ответа

Решение

Вкратце, что вам нужно сделать, это:

  1. создайте объект (класс), который содержит ваши 4 поля (от / до / enum / message)
  2. сериализовать это. Он должен реализовывать Serializable. Смотрите другие решения здесь для того, чтобы сериализовать
  3. преобразовать в байтовый массив и отправить сокет (подробности см. в другом месте)

На другом конце вы прочитаете этот поток, десериализуетесь и приведете его к экземпляру вашего класса, определенного в пункте 1. выше.

Создав один объект, содержащий 4 поля, и сериализовав этот объект, вы сможете отправить все четыре поля вместе (у меня сложилось впечатление, что это камень преткновения?).

Обратите внимание, что датаграммы будут иметь ограничения по размеру, наложенные сетевыми транспортными уровнями, но для этого приложения я подозреваю, что это не проблема.

Вы можете отправить любой сериализуемый объект, используя что-то вроде этого.

ByteArrayOutputStream buffer = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(buffer);
out.writeObject(objectYouWantToSend);
out.close();
buffer.close();
DatagramPacket packet = new 
    DatagramPacket(buffer.toByteArray(), 
                   buffer.size(), 
                   InetAddress.getByName(...),
                   portNumber);
socket.send(packet);

Вы просто добавляете их перед передачей в сетевой интерфейс. Что-то вроде:

byte[] buff = new byte[256];
// Add al your fields here to buff.
DatagramPacket packet = new DatagramPacket(buff, buff.length, address, 1234);
socket.send(packet);

Если они не все строки, вам нужно закодировать их как таковые.

Существует множество вариантов кодирования данных, все из которых сводятся к тому, что четыре поля объединяются в одну структуру данных, а затем отправляются все за один раз.

Важной частью является то, что кодирование должно показать, какое из четырех полей находится в какой точке пакета, иначе дальний конец не сможет надежно его декодировать.

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