Как происходит получение данных через протокол 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);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д