Пример #1
0
        //Метод обработки конкретного клиента
        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);
            }
        }