Труднее получить протокол обмена сообщениями, если вы работаете с простыми байтами и строковыми сообщениями.
Вы лучше всего создаете модель - что-то вроде
public class NetMessage{
public int MessageType{get;set;}
public dynamic Payload{get;set;}
}
Итак, пусть Imaging MessageType 1 - это ваш запрос аутентификации.
это было бы что-то вроде
{ "MessageType":"1", "PayLoad":{
"Username":"Admin",
"Password":"Password123"
}
}
Вы можете либо сериализовать это в строку и отправить его (через Newtonsoft.Json)
Или, как я предпочитаю, использовать двоичный форматер для непосредственного преобразования объекта в байты и последующей отправки байтов по сети.
Отправка сериализованных данных в виде байтов будет немного более эффективной, чем отправка строковой информации по сети.
Используя протокол, описанный выше, вы можете заставить свой сервер выполнять оператор switch для MessageType, а затем обрабатывать логику по-другому.
По вашему вопросу вы хотите отправить список подключенных клиентов?
Используйте что-то вроде MessageType 99 и установите в качестве полезной нагрузки список клиентов.
Просто помните, что вы не можете сериализовать объект TcpClient и отправить его удаленному пользователю и ожидать, что объект будет функционировать как подключенный TcpClient.
Вы можете максимально отправить удаленный IP-адрес и порт, к которому подключен сервер.
Поэтому я бы рекомендовал отправить модель, которая представляет эти данные.
UPDATE:
В данный момент ваш фоновый работник получает данные и обрабатывает их как байты -> текст, а затем выполняет бизнес-логику прямо над текстом.
То, что вы должны использовать, это управляемые типы, кроме строкового типа.
Строка слишком низкого уровня, вам нужно несколько промежуточных типов, чтобы помочь управлять логикой.
Используйте менеджер пакетов nuget в Visual Studio для установки Newtonsoft.Json
(или JSON.Net иногда называют)
С Newtonsoft вы можете делать следующее.
Учитывая класс, который выглядит так
public class MessageClass
{
public int MessageType{get;set;}
public dynamic Payload{get;set;}
}
Вы можете сделать следующее
string content = "{\"MessageType\":\"2\",\"Payload\":\"blah\"}";
Это строка в формате JSON, представляющая экземпляр класса.
В C # Code этот объект будет выглядеть так:
var message = new MessageClass();
message.MessageType=2;
message.Payload = "blah";
Что дает вам Newtonsoft - это возможность превращать строки в управляемые типы C #.
Например:
Помните нашу строку выше под названием 'content'?
var managedObject = JsonConvert.DeserializeObject<MessageClass>(content);
Console.WriteLine(managedObject.MessageType); // will; write 2
Я предлагаю, чтобы ваш клиент и сервер связывались через объекты в формате JSON, что затем дает вам возможность выполнять более сложные условные выражения и более точные утверждения.
Newtonsoft предоставляет 2 ключевых метода для вас.
Документально подтверждено на сайте newtonsoft.
newtonsoft.com/json/help/html/Methods_T_Newtonsoft_Json_JsonConvert.htm
Чтобы превратить объект C # в строку
JsonConvert.SerializeObject (object o);
JsonConvert.DeserializeObject (String value);
Для метода десериализации укажите тип, к которому вы его десериализируете, где T.
Например:
MessageClass msg = JsonConvert.DeserializeObject<MessageClass>(content);