c # Сокет сообщений между клиентом и сервером - PullRequest
0 голосов
/ 03 июля 2018

В настоящее время я изучаю, как использовать сокеты на c #, и у меня возник вопрос о том, как должны передаваться сообщения между клиентом и сервером.

В настоящее время у меня есть серверное приложение и клиентское приложение, и в каждом приложении у меня есть несколько строк, которые являются командами. Когда, например, клиенту нужно время с сервера, у меня есть такая строка:

public const string GET_TIME_COMMAND = "<GET_TIME_COMMAND>";

Тогда у меня есть оператор if на сервере, который проверяет, начинается ли сообщение, отправленное клиентом, с этой строки, и если да, он отправляет клиенту другое сообщение с другой командой и со временем в строке json.

У меня вопрос: это хороший способ сделать это, и если нет, то не могли бы вы посоветовать мне другой способ сделать это?

1 Ответ

0 голосов
/ 03 июля 2018

TCP

Имейте в виду, что TCP является потоковым соединением. Вы можете или не можете получить полную команду в одном сообщении. Вы можете даже получить несколько команд за одно чтение.

Чтобы решить эту проблему, сообщения TCP обычно имеют уникальную последовательность старта и остановки или байт, который может не быть частью сообщения.

(SomeCommand)

Где ( - начало, а ) - символ остановки.

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

11 S O M E M E S S A G E

Где 11 - длина сообщения, а somemessage - фактическое сообщение. Обычно вы передаёте длину в байтах или коротких словах, а не в строковом литерале.

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

Также TCP основан на соединении. Вы должны подключиться к удаленному сайту. Преимущество состоит в том, что TCP гарантирует, что все сообщения отправляются в том порядке, в котором вы их поместили. TCP также автоматически повторно отправит потерянные пакеты, и вам не нужно об этом беспокоиться.

UDP

В отличие от этого, UDP основан на сообщениях / пакетах, но он ненадежен. Вы можете получить или не получить сообщение, и в некоторых случаях вам придется отправлять его повторно. Также UDP не имеет понятия «сессия». Вы должны будете сделать это самостоятельно, если потребуется.

Ответ на ваш вопрос зависит от используемого протокола. Для TCP это не будет хорошо работать с вашим текущим форматом сообщения. Возможно, вам придется добавить заголовок.

Вы можете использовать UDP, но тогда вам, возможно, придется обнаруживать и повторно отправлять потерянные сообщения.

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