Использование Java для отправки / получения различных объектов через UDP - PullRequest
0 голосов
/ 29 мая 2010

Я пишу программу на Java, где есть связь между двумя или более компьютерами, использующими UDP. Мое приложение отправляет объекты после сериализации их по сети на другой компьютер, где оно будет десериализовано и обработано. До сих пор мне удалось отправить один вид объектов.

Моя проблема в том, что я хочу, чтобы отправитель мог отправлять объекты различного типа, а получатель мог их получать и снова приводить к соответствующим типам. Однако, поскольку UDP выделяет байтовый буфер, а затем получает данные в буфер, невозможно преобразовать или определить тип полученного объекта, поскольку разные объекты имеют разные размеры.

Есть ли способ, с помощью которого я могу отправлять различные типы объектов с использованием UDP, а затем получать их на другом конце? (Я не прошу код здесь, только некоторые идеи)

Спасибо

Edit: Я ищу лучший способ отправки / получения различных типов объектов, не зная, какой тип следующего ожидаемого объекта. Скажем, у меня есть три типа объектов, и я ожидаю получить любой из них в любое время. Еще одна вещь, которая пришла мне в голову после комментария Брайана: как установить размер буфера для типов данных переменного размера, таких как Strings, Arrays и т. Д. Как и при получении пакета UDP, вы должны сначала выделить буфер с размером для получения этого объекта. Это как-то связано с моим первоначальным вопросом.

Ответы [ 3 ]

2 голосов
/ 29 мая 2010

То, что вы сериализуете (используете ObjectOutputStream), также может быть десериализовано (с ObjectInputStream). Вы получаете объект тогда. Он не играет никакой роли, если вы транспортируете его через UDP, TCP, канал, локальный файл или что-то еще. Сериализация записывает в OutputStream, десериализация читает из InputStream.

Вы myObject.getClass (), чтобы обнаружить, что вы получили.

2 голосов
/ 29 мая 2010

Почему бы не обернуть их в известный тип (Packet) с полезной нагрузкой типа Object? Затем вы можете десериализовать ваш Packet и опросить полученную полезную нагрузку для его типа.

0 голосов
/ 30 мая 2010

По сути, это десериализация объекта и затем проверка instanceof. Тем не менее, поскольку вы явно упоминаете проблему байтовых буферов при использовании UDP, я предлагаю взглянуть на библиотеку сообщений , которая уже выполняет такой тип управления байтовыми буферами: JGroups

В псевдокоде работа с jgroups выглядит следующим образом:

JChannel channel = new JChannel("myapp");
Customer c = new Customer("IniTrodeInc.);
Book b = new Book("Twilight");
channel.send(new Message(c));
channel.send(new Message(b));

И на приемном конце

JChannel channel = new JChannel("myapp");
channel.addListener(new Listener(){
 public void onMessage(Message m) {
   if (m.getObject() instanceof Customer) {
     handleNewCustomer((Customer)m.getObject()));
   } else if (m.getObject() instanceof Book) {
     handleNewBook((Book)m.getObject()));
   } else {
     // Ups, we received s.t.h else
   }
 }
});

JGroups выполняет абстракцию канала обмена сообщениями автоматически, вам не нужно знать, является ли это UDP, TCP или многоадресной передачей и т. Д. JGroups также будет обрабатывать одноранговую связь, например, отправка сообщений на одноранговые узлы, которые еще не получили сообщение и т. д.

...