Сервер - клиентский проект (протоколы обмена сообщениями) - PullRequest
0 голосов
/ 21 августа 2011

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

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

Я читал о протоколах обмена сообщениями и об использовании первых нескольких байтов каждого сообщения, чтобы сообщить серверу, что они пытаются сделать. Проблема в том, что я НЕ знаю, как это сделать. Так может кто-нибудь показать мне пример создания форматированного сообщения?

Может быть, стоит упомянуть, что я использую классы StreamReader и StreamWriter для передачи данных между сервером и клиентами. Это хороший способ?


Добавить:

Моя проблема сейчас в том, как разделить эти данные, чтобы сервер знал, что с ними делать. Я читал об использовании 1-го байта, чтобы «быть зарезервированным» для типа сообщения. Но проблема в том, что я не знаю, как решить эту проблему. До сих пор я использовал только классы StreamReader и StreamWriter для передачи только строк. Если я использую этот вид кодирования, все станет слишком запутанным (не узнаваемым), если вы понимаете, о чем я.

Так что мне нужно сделать что-то вроде этого:

Для отправки байтов:

  • Первые несколько байтов тип данных (но я не знаю, какой класс использовать, может быть BinaryWriter и BinaryReader на другой стороне ??)

  • остальная часть сообщения

  • на сервере У меня должен быть некоторый код, который распознает эти «первые несколько байтов», чтобы код знал, что делать с тестом сообщения.

  • и на основе этих «первых нескольких байтов» код должен отправлять данные клиентам

Есть ли у вас какие-либо идеи о том, как это может выглядеть, я имею в виду как скелет (что-то базовое, поэтому я могу работать с ним).

Каждая помощь будет очень признательна.


Я нашел один пример здесь на stackOverflow.com. Кажется, это код в правильном направлении. Как вы думаете, ребята?

Ответы [ 2 ]

0 голосов
/ 21 августа 2011

У вас есть несколько вариантов: Сделайте формат сообщения текстовым - включая его заголовок. Таким образом, заголовок содержит размер сообщения, записанный в виде текстовой строки, и заканчивается некоторым терминатором (например, \ r \ n). HTTP использует этот подход - заголовки являются текстовыми. При получении сообщения вы обрабатываете его с помощью ReadLine и анализируете строки заголовка с такими вещами, как int.TryParse (str).

Отправить сообщение:

output.WriteLine(message.Length);
output.Write(message);

Получить сообщение:

int len = int.Parse(input.ReadLine());
//message is the next 'len' characters

Второй вариант: все сообщение в двоичном формате - заголовок сообщения является двоичным, и среди прочего указывает длину сообщения. Содержимое сообщения записывается в виде потока байтов, закодированных с использованием, например, Encoding.UTF8.GetBytes (str).

Или, возможно, использовать протокол HTTP? Я считаю, что есть базовая поддержка HTTP-сервера в виде HttpListener . Вот простое введение в HttpListener

Что бы вы ни делали, избегайте использования WCF:)

0 голосов
/ 21 августа 2011

Одним из вариантов, который может быть намного проще, чем определение собственного протокола, было бы использование некоторой существующей библиотеки, например WCF или JSON-RPC .

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

...