Как происходит получение данных через протокол 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);