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

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

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

Имеется клиент-серверное приложение:
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Net.Sockets;
  7. using System.Net;
  8. using System.Threading;
  9. namespace ConsoleServer
  10. {
  11. public class ClientObject
  12. {
  13. public TcpClient client;
  14. public ClientObject(TcpClient tcpClient)
  15. {
  16. client = tcpClient;
  17. }
  18. public void Process()
  19. {
  20. NetworkStream stream = null;
  21. try
  22. {
  23. stream = client.GetStream();
  24. byte[] data1 = new byte[64]; // буфер для получаемых данных
  25. while (true)
  26. {
  27. // получаем сообщение
  28. StringBuilder builder = new StringBuilder();
  29. int bytes = 0;
  30. do
  31. {
  32. bytes = stream.Read(data1, 0, data1.Length);
  33. builder.Append(Encoding.UTF8.GetString(data1, 0, bytes));
  34. }
  35. while (stream.DataAvailable);
  36. string message = builder.ToString();
  37. Console.WriteLine(message);
  38. // Отправляем обратно сообщение в верхнем регитсре
  39. message = message.Substring(message.IndexOf(':') + 1).Trim().ToUpper();
  40. data1 = Encoding.UTF8.GetBytes(message);
  41. stream.Write(data1, 0, data1.Length);
  42. }
  43. }
  44. catch (Exception exc)
  45. {
  46. Console.WriteLine(exc.Message);
  47. }
  48. finally
  49. {
  50. if (stream != null)
  51. stream.Close();
  52. if (client != null)
  53. client.Close();
  54. }
  55. }
  56. }
  57. class Program
  58. {
  59. const int port = 8888;
  60. static TcpListener listener;
  61. static void Main(string[] args)
  62. {
  63. try
  64. {
  65. listener = new TcpListener(IPAddress.Parse("127.0.0.1"), port);
  66. listener.Start();
  67. Console.WriteLine("Ожидание подключений...");
  68. while (true)
  69. {
  70. TcpClient client = listener.AcceptTcpClient();
  71. ClientObject clientObject = new ClientObject(client);
  72. // Создаем новый поток для обслуживания нового клиента
  73. Thread clientThread = new Thread(new ThreadStart(clientObject.Process));
  74. clientThread.Start();
  75. }
  76. }
  77. catch (Exception exc)
  78. {
  79. Console.WriteLine(exc.Message);
  80. }
  81. finally
  82. {
  83. if (listener != null)
  84. listener.Stop();
  85. Console.ReadLine();
  86. }
  87. }
  88. }
  89. }
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Net.Sockets;
  7. namespace ConsoleClient
  8. {
  9. class Program
  10. {
  11. const int port = 8888;
  12. const string address = "127.0.0.1";
  13. static void Main(string[] args)
  14. {
  15. Console.Write("Введите свое имя: ");
  16. string userName = Console.ReadLine();
  17. TcpClient client = null;
  18. try
  19. {
  20. client = new TcpClient(address, port);
  21. NetworkStream stream = client.GetStream();
  22. while (true)
  23. {
  24. Console.Write(userName + ": ");
  25. // Ввод сообщения
  26. string message = Console.ReadLine();
  27. message = String.Format($"{userName}: {message}");
  28. // Преобразуем сообщение в массив байтов
  29. byte[] data = Encoding.UTF8.GetBytes(message);
  30. // Отправка сообщения
  31. stream.Write(data, 0, data.Length);
  32. // Получаем ответ
  33. data = new byte[64]; // буфер для получаемых данных
  34. StringBuilder builder = new StringBuilder();
  35. int bytes = 0;
  36. do
  37. {
  38. bytes = stream.Read(data, 0, data.Length);
  39. builder.Append(Encoding.UTF8.GetString(data, 0, bytes));
  40. }
  41. while (stream.DataAvailable);
  42. message = builder.ToString();
  43. Console.WriteLine("Сервер: " + message);
  44. }
  45. }
  46. catch (Exception exc)
  47. {
  48. Console.WriteLine(exc.Message);
  49. }
  50. finally
  51. {
  52. client.Close();
  53. Console.ReadLine();
  54. }
  55. }
  56. }
  57. }
Не до конца понятен данный фрагмент кода:
Листинг программы
  1. byte[] data1 = new byte[64]; // буфер для получаемых данных
  2. while (true)
  3. {
  4. // получаем сообщение
  5. StringBuilder builder = new StringBuilder();
  6. int bytes = 0;
  7. do
  8. {
  9. bytes = stream.Read(data1, 0, data1.Length);
  10. builder.Append(Encoding.UTF8.GetString(data1, 0, bytes));
  11. }
  12. while (stream.DataAvailable);
  13. string message = builder.ToString();
  14. Console.WriteLine(message);
  15. // Отправляем обратно сообщение в верхнем регистре
  16. message = message.Substring(message.IndexOf(':') + 1).Trim().ToUpper();
  17. data1 = Encoding.UTF8.GetBytes(message);
  18. stream.Write(data1, 0, data1.Length);
  19. }
Когда клиент отправляет сообщение оно сначала преобразуется в массив байтов и затем уже идет отправка. Не могу понять какую роль играет переменная bytes и что из себя представляют параметры методов stream.Read(data1, 0, data1.Length); и builder.Append(Encoding.UTF8.GetString(data1, 0, bytes)); Так же не пойму в каких значениях хранится массив байтов и как происходит преобразование обратно в текст? Объясните пожалуйста пошагово фрагмент показанного мною когда, чтобы понять принцип получения и отправки данных между клиентом и сервером.

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

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

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


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

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

10   голосов , оценка 3.5 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы