2014-02-20 6 views
2

Я работаю над проектом, который включает несколько приложений на нескольких компьютерах. Основным приложением является сервер сокетов C++, работающий на сервере CentOS, а клиентское приложение - это программа Java, работающая на клиентских компьютерах.Протокол связи сокета/стандарт

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

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

  • Если C++ и Java программы написать свои собственные классы/парсер для проверки достоверности сообщений?
  • Должен ли я создать XML-файл (обслуживаемый через HTTP), который определяет все коммуникационные сообщения? (То, что клиент/сервер будет анализировать и создавать действия для)
  • Или использовать какой-то сторонней библиотеки (Google Protocol Buffers?)

Дело в том, что когда сервер сокет посылает сообщение X, то клиент должен знать, что с ним делать. То же самое применяется в другом направлении.

Что было бы лучшим способом реализовать это? Наличие файла XML будет приятным, так как клиент/сервер может его проанализировать и создать методы/действия на основе данных. Но более четким подходом было бы создание классов, которые будут выполнять синтаксический анализ.

+0

Почему XML, а не JSON? Кроме того, если вы хотите легко отладить свой протокол, лучше использовать текстовый протокол; но это ваш выбор в конечном счете. – fge

+0

Сообщения основаны на тексте. – DavidS

+0

Да, но я говорил о протоколе вообще (что обертывает сообщения и т. Д.) – fge

ответ

0

Я всегда делаю это двоично. Сначала вы должны решить, какой базовый транспортный протокол использовать, это могут быть UDP, TCP, TCS, SSL. Я бы начал с TCP, так как он очень стабилен и прост в использовании.

Простой способ обработки пакетов в каждом пакете начинается с числа, которое указывает, какой пакет это. На основе этого номера вы отправляете пакет в соответствующий класс, который обрабатывает данные. Это можно легко сделать как на C++, так и на Java. Я думаю, что на C++ проще, так как там вы можете основывать, не первый номер, прочитанный во всей структуре, но в Java вам обычно нужно прочитать его примитивным примитивным.

Помните, что стандартом через Интернет является использование значений в формате big-endian, но обычный на большинстве компьютеров сегодня (Intel, AMD, ARM ...) использует значения little-endian. Поэтому в C++ вам нужно будет перевернуть все примитивы перед их отправкой. И вам также нужно перевернуть полученные значения. Я не знаю, делает ли это Java для вас ...

+1

Вам не нужно использовать big endian over TCP, вы можете так же легко использовать маленький endian. –

0

ICE by ZeroC - это кросс-платформенная и кросс-языковая библиотека для связи между TCP и IP между C++ и Java. Я использовал ICE для связи между Linux/AIX/Solaris для программ на C++/Java без проблем. ICE использует бинарный протокол передачи, который делает для вас решение для большого или младшего конца. Недостатком ICE является то, что вам необходимо определить сообщения и вызовы, используя свой собственный язык.

Смежные вопросы