//Метод обработки конкретного клиента private async Task HandleClient(TcpClient client) { //Оборачиваем TcpClient в наш собственный класс RemoteClient //Сделано для сопоставления TCP соединения и нашей моделей пользователя //Чтобы понимать, по какому соединению необходимо отправлять данные RemoteClient remoteClient = new RemoteClient( //Аргументом является функция отправки сообщения //Этому клиенту. Мы и пишем, что при отправке сообщения //Этому клиенту надо отправить данное сообщение именно на этот client R => SendResponseToClient(R, client)); //Вызываем событие о том, что клиент присоединился. //Так внешний код сможет узнать о том, что подсоединился новый клиент //И начать следить ща его действиями ClientAccepted?.Invoke(remoteClient); //Пока не отменили работу while (!cancellationToken.IsCancellationRequested) { //Буффер для хранения длины сообщения var messageLength = new byte[4]; //Буффер для хранения самого сообщения var buffer = new byte[4096]; //Читаем 4 байта, представляющие длину сообщения await client.GetStream().ReadAsync(messageLength, 0, 4); //Преобразуем эти 4 байта в число var length = BitConverter.ToInt32(messageLength, 0); //Читаем все сообщение в спец буффер для сообщения //Читаем именно нужное нам колчество денег await client.GetStream().ReadAsync(buffer, 0, length); //Получаем из считанныз байт саму строку JSON //которую нам прислал клиент var jsonString = Encoding.UTF8.GetString(buffer, 0, length); //Разбираем строку и кладем все данные в JToken var token = JToken.Parse(jsonString); //Выводим сообщение о том, что мы получили некое сообщение Console.WriteLine("Received message"); //Уведомляем клиента о том, что пришло новое сообщение remoteClient.Notify(token); } }