Простой протокол чата - PullRequest
0 голосов
/ 06 июля 2011

Я изучаю сетевое взаимодействие и потоки в C #. Для этого я разрабатываю чат по сети.

В настоящее время у меня есть базовая связь между клиентом и сервером (TCP). Сервер может работать с несколькими клиентами. Но только клиент-серверная связь. Обычно клиент отправляет сообщение в кодировке ASCII на сервер, затем сервер декодирует его и показывает в консоли.

К настоящему времени я хочу реализовать связь клиент-клиент.

Предположим, у нас есть онлайн-список клиентов в каждом клиенте и окно сообщения для отправки сообщения каждому клиенту.

Следующим шагом является нажатие кнопки, которая будет составлять Socket и отправлять, после чего Сервер должен понять, кому адресовано сообщение.

Итак, какова должна быть моя структура сообщения и как я должен понимать в Сервере, кому адресовано сообщение?

Обычно мне не нужен код, я хочу теорию. Просто и коротко. Может быть, учебники?

Я изучил XMPP. Это очень тяжело. Мне просто нужно направление, как я могу это сделать. Моя цель - учиться, а не реализовывать это и забыть.

1 Ответ

5 голосов
/ 06 июля 2011

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

Есть два способа определить, когда заканчивается сообщение. Первый способ - добавить разделитель в конце сообщения, а второй - включить длину в заголовок.

HTTP использует оба. Он использует пустую строку, чтобы определить, когда заканчивается заголовок. И в заголовке он получил заголовок Content-Length, который сообщает, каков размер тела.

Для двоичных протоколов я предлагаю использовать заголовок фиксированной длины, где первое целое число (4 байта) является версией, а второе целое число является длиной тела. Таким образом, вы можете легко переключать макет заголовка между версиями (поскольку версия является первым целым числом).

Для текстового протокола это действительно зависит от того, как выглядит содержимое сообщения. Проблема в том, что контент может не содержать разделитель, который будет использоваться (что может быть сложно, если вы транспортируете сообщения чата). Конечно, вы можете избежать разделителя, если он существует в реальном сообщении чата. Но, пожалуй, лучший подход - использовать макет заголовка / тела, такой как HTTP (так как его также довольно легко разобрать, и вы можете иметь количество заголовков X без необходимости менять парсер).

Сообщение будет выглядеть так:

From: Arne
To: #ChannelName
WrittenAt: 2011-07-03 12:00 GMT
Content-Length: 16

This is a text

Обратите внимание, что длина равна 16, так как новая строка была включена в тело.

Что касается общения клиент-клиент, я бы всегда проходил через сервер, если вы новичок. Это намного проще, так как в противном случае вам нужно убедиться, что хотя бы один из клиентов не находится за маршрутизатором (или будет невозможно доставить сообщение).

Просто проверьте заголовок To, если это для чата или пользователя.

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