Как происходит получение данных через протокол TCP - C#

Узнай цену своей работы

Формулировка задачи:

Имеется клиент-серверное приложение:
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);
                }
Когда клиент отправляет сообщение оно сначала преобразуется в массив байтов и затем уже идет отправка. Не могу понять какую роль играет переменная bytes и что из себя представляют параметры методов stream.Read(data1, 0, data1.Length); и builder.Append(Encoding.UTF8.GetString(data1, 0, bytes)); Так же не пойму в каких значениях хранится массив байтов и как происходит преобразование обратно в текст? Объясните пожалуйста пошагово фрагмент показанного мною когда, чтобы понять принцип получения и отправки данных между клиентом и сервером.

Решение задачи: «Как происходит получение данных через протокол TCP»

textual
Листинг программы
bytes = stream.Read(data1, 0, data1.Length);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.5 из 5
Похожие ответы