Как реализовать протокол приложения - PullRequest
2 голосов
/ 27 августа 2010

Мы хотим реализовать серверное / клиентское приложение для внутреннего использования. Кто-нибудь знает, как реализовать протокол приложения на основе сокета?

С наилучшими пожеланиями!

Ответы [ 3 ]

2 голосов
/ 27 августа 2010

Протокол в сокетах может быть реализован почти как последовательный протокол. Но хорошим примером является использование команд, которые вы могли бы реализовать с использованием некоторого макета, основанного на позициях текста в его более простой форме, например

Клиент пишет:

$ADD|Yongwei|Xing|25|M|#

Сервер отвечает и подтверждает, что все прошло нормально (данные были действительны) или Ошибка с кодом, если нет:

$ACK#

или

$ERR|2|#

Где ADD - команда, которую ваш код должен прочитать и оценить. Возможно, вы можете использовать первые три символа в качестве команды и разделенные параметры, как в этом примере.

Я рекомендую использовать специальные символы вместо разделителей $ и #. Специальные символы - это первые 30 символов таблицы ASCII, и для работы есть правильные символы:

dec   char    meaning:
  2   STX     Start of text
  3   ETX     End of text
  4   EOT     End of trasmission
  5   ENQ     Enquiry (asking for data, asking for a chance of transmission)
  6   ACK     Acknowledge (confirmation of data received, allowing trasmission)

Подтверждение может быть использовано в качестве подтверждения, например,

Клиент уведомляет сервер о том, что он намеревается передать некоторые данные, отправив запрос ascii char (я использую <и> для выражения специального символа):

<ETX>

Если сервер готов к чтению данных, подтверждает подтверждение:

<ACK>

затем клиент начинает отправку данных с командами:

<STX>ADD|jhon|deer|56|M|<ETX>

и для каждой команды сервер подтверждает это <ACK> Таким образом, клиент продолжает передачу, а когда данные передаются, затем отправляет <EOT>, чтобы заметить сервер, что он может прекратить чтение данных (поэтому пытается прочитать его как команду).

0 голосов
/ 28 августа 2010

Для внутреннего использования самое простое решение - лучшее решение. Используя сокеты (winsock2 в Windows, POSIX сокеты в * BSD и Linux), вы должны обмениваться простым текстом между клиентом и сервером, например FTP протокол , например:

В FTP клиент отправляет команды наподобие ключевых слов ASCII: QUIT, LIST, STOR ... с аргументами, разделенными пробелом. Маркер должен указывать конец команды. Простейшим маркером является символ \n. Затем сервер отправляет обратно код возврата клиенту, чтобы указать, есть ли ошибка или нет. Код возврата - это просто число, все в виде простого текста. Вместе с кодом возврата есть небольшое сообщение, которое объясняет ошибку, если она есть.

FTP был указан в RFC в 1985 году. И он все еще работает нормально и все еще широко используется. HTTP подобен в том смысле, что клиент отправляет заголовок HTTP, состоящий из нескольких строк в виде простого текста, разделенных \n.

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

Самое простое, что нужно сделать, это использовать ssh (например, OpenSSH ) для шифрования сетевого подключения. Это позволяет вам контролировать, кто может вызвать сервер (аутентификация) и позволяет шифровать ваши данные. Шифрование ваших данных не требуется, если они находятся в частной сети, предназначенной только для вашего приложения.

0 голосов
/ 27 августа 2010

Это довольно открытый вопрос, но если вы работаете на уровне сокетов, вы, вероятно, слишком глубокий уровень, особенно если вы занимаетесь разработкой приложений. Библиотека, такая как boost :: asio для сетевого взаимодействия и протокольные буферы для представления и кодирования / декодирования, поможет. Использование Google Web Toolkit (GWT) упростит создание пользовательского интерфейса. Возможно, вы также рассмотрите возможность использования App Engine для размещения внутреннего кода, поскольку это обеспечит вам более высокую надежность и масштабируемость, чем большинство рабочих заданий.

...