Как происходит получение данных через протокол TCP - C#
Формулировка задачи:
Имеется клиент-серверное приложение:
Не до конца понятен данный фрагмент кода:
Когда клиент отправляет сообщение оно сначала преобразуется в массив байтов и затем уже идет отправка.
Не могу понять какую роль играет переменная bytes и что из себя представляют параметры методов stream.Read(data1, 0, data1.Length); и builder.Append(Encoding.UTF8.GetString(data1, 0, bytes));
Так же не пойму в каких значениях хранится массив байтов и как происходит преобразование обратно в текст?
Объясните пожалуйста пошагово фрагмент показанного мною когда, чтобы понять принцип получения и отправки данных между клиентом и сервером.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Net.Sockets; using System.Net; using System.Threading; namespace ConsoleServer { public class ClientObject { public TcpClient client; public ClientObject(TcpClient tcpClient) { client = tcpClient; } public void Process() { NetworkStream stream = null; try { stream = client.GetStream(); byte[] data1 = new byte[64]; // буфер для получаемых данных while (true) { // получаем сообщение StringBuilder builder = new StringBuilder(); int bytes = 0; do { bytes = stream.Read(data1, 0, data1.Length); builder.Append(Encoding.UTF8.GetString(data1, 0, bytes)); } while (stream.DataAvailable); string message = builder.ToString(); Console.WriteLine(message); // Отправляем обратно сообщение в верхнем регитсре message = message.Substring(message.IndexOf(':') + 1).Trim().ToUpper(); data1 = Encoding.UTF8.GetBytes(message); stream.Write(data1, 0, data1.Length); } } catch (Exception exc) { Console.WriteLine(exc.Message); } finally { if (stream != null) stream.Close(); if (client != null) client.Close(); } } } class Program { const int port = 8888; static TcpListener listener; static void Main(string[] args) { try { listener = new TcpListener(IPAddress.Parse("127.0.0.1"), port); listener.Start(); Console.WriteLine("Ожидание подключений..."); while (true) { TcpClient client = listener.AcceptTcpClient(); ClientObject clientObject = new ClientObject(client); // Создаем новый поток для обслуживания нового клиента Thread clientThread = new Thread(new ThreadStart(clientObject.Process)); clientThread.Start(); } } catch (Exception exc) { Console.WriteLine(exc.Message); } finally { if (listener != null) listener.Stop(); Console.ReadLine(); } } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Net.Sockets; namespace ConsoleClient { class Program { const int port = 8888; const string address = "127.0.0.1"; static void Main(string[] args) { Console.Write("Введите свое имя: "); string userName = Console.ReadLine(); TcpClient client = null; try { client = new TcpClient(address, port); NetworkStream stream = client.GetStream(); while (true) { Console.Write(userName + ": "); // Ввод сообщения string message = Console.ReadLine(); message = String.Format($"{userName}: {message}"); // Преобразуем сообщение в массив байтов byte[] data = Encoding.UTF8.GetBytes(message); // Отправка сообщения stream.Write(data, 0, data.Length); // Получаем ответ data = new byte[64]; // буфер для получаемых данных StringBuilder builder = new StringBuilder(); int bytes = 0; do { bytes = stream.Read(data, 0, data.Length); builder.Append(Encoding.UTF8.GetString(data, 0, bytes)); } while (stream.DataAvailable); message = builder.ToString(); Console.WriteLine("Сервер: " + message); } } catch (Exception exc) { Console.WriteLine(exc.Message); } finally { client.Close(); Console.ReadLine(); } } } }
byte[] data1 = new byte[64]; // буфер для получаемых данных while (true) { // получаем сообщение StringBuilder builder = new StringBuilder(); int bytes = 0; do { bytes = stream.Read(data1, 0, data1.Length); builder.Append(Encoding.UTF8.GetString(data1, 0, bytes)); } while (stream.DataAvailable); string message = builder.ToString(); Console.WriteLine(message); // Отправляем обратно сообщение в верхнем регистре message = message.Substring(message.IndexOf(':') + 1).Trim().ToUpper(); data1 = Encoding.UTF8.GetBytes(message); stream.Write(data1, 0, data1.Length); }
Решение задачи: «Как происходит получение данных через протокол TCP»
textual
Листинг программы
bytes = stream.Read(data1, 0, data1.Length);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д