Java Socket Programming: работа с несколькими типами сообщений - PullRequest
0 голосов
/ 13 августа 2011

Я разрабатываю простую многоадресную сетевую программу, и мне было просто интересно узнать, какая структура классов лучше всего подходит для шаблонов OOD, которые лучше всего подходят для клиент-серверной или клиент-клиентской сети.Моя дилемма в том, что я буду отправлять сообщения различного типа через дейтаграмму, и получатель просто видит, что на них поступает куча байтов.Теперь я уже реализовал своего рода заполнитель «ID» в качестве первого байта всех моих байтовых массивов, чтобы различать, например, сообщение, содержащее «hello world», и сообщение, содержащее координаты пользователя.Похоже, что единственный вариант заключается в том, чтобы в моем методе «получения» был огромный набор операторов case, основанных на том, что такое «ID», но это кажется плохой практикой.Просто ищите идеи, чтобы воспользоваться преимуществами шаблонов OOD Java и всесторонней хорошей практикой кодирования.

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

Ответы [ 2 ]

2 голосов
/ 13 августа 2011

Здесь есть несколько вариантов, в зависимости от обстоятельств.

  1. Вы можете отправлять сериализованные объекты, по одному для каждого типа сообщений. Сериализованные объекты Java обычно работают только между приложениями Java, но вы также можете попробовать буферы протокола для взаимодействующих объектов (http://code.google.com/p/protobuf/)

  2. Вы можете отправлять документы в совместимом формате, таком как JSON или XML

  3. Вы можете создать свой собственный формат и анализировать текст так, как вам нравится

мне, я бы, наверное, пошел с буфером протокола

2 голосов
/ 13 августа 2011

Есть несколько возможностей, но шаблон стратегии , кажется, подходит лучше всего.

В вашей ситуации я бы создал интерфейс по крайней мере с двумя методами: один для определения, может ли класс обрабатывать сообщение (которое будет проверять ваши биты идентификатора), а другой - для фактической обработки сообщения. Затем вы создаете отдельный класс обработки сообщений для каждого типа сообщений.

В этом случае обработчик входящих сообщений будет иметь набор или список этих объектов обработки сообщений (обычно это разные классы, но все они реализуют интерфейс). Когда сообщение получено, обработчик сообщения будет перебирать объекты обработки сообщения до тех пор, пока один из них не сможет обработать найденное сообщение, выдав ошибку, если обработчик сообщения не обработает сообщение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...