Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
2 / 2 / 0
Регистрация: 09.11.2014
Сообщений: 124

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

24.07.2016, 19:27. Показов 2777. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется клиент-серверное приложение:
сервер

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
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();
            }
        }
    }
}


клиент

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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();
            }
        }
    }
}

Не до конца понятен данный фрагмент кода:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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));
Так же не пойму в каких значениях хранится массив байтов и как происходит преобразование обратно в текст?
Объясните пожалуйста пошагово фрагмент показанного мною когда, чтобы понять принцип получения и отправки данных между клиентом и сервером.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.07.2016, 19:27
Ответы с готовыми решениями:

Как можно узнать через VBA , есть ли tcp/ip протокол...
если есть, то как можно узнать , локальный ip адресс...

Как создать локальную сеть через протокол TCP\IPv6?
как создать локальную сеть через протокол TCP\IPv6? ДАНО: роутер D-LINK DIR-300 rev. B7, интернет протокола tcp\ipv4 (DSL-Ростелеком),...

Как перехватывать в Charles информацию, которая идёт через TCP протокол?
Не могу понять.

3
 Аватар для m0nax
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
24.07.2016, 21:54
bytes это количество прочитанных данных
параметры метода read это массив куда надо положить прочитанные данные и его размер (перевести Length, ага)
прочитанный кусок конвертируется в строку волшебным образом и добавляется, как ни странно, к общей накопленной строке(чтоб получить итоговое цельное значение)
0
2 / 2 / 0
Регистрация: 09.11.2014
Сообщений: 124
24.07.2016, 23:29  [ТС]
m0nax, то есть переменной bytes присваивается размер прочитанных данных, а куда же сами данные записываются до присваивания этого потока переменной StringBuilder?
Не могу понять, что за значения будут в переменных bytes и data1 после этой строки
C#
1
bytes = stream.Read(data1, 0, data1.Length);
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
25.07.2016, 10:56
Цитата Сообщение от Iron Brain Посмотреть сообщение
bytes = stream.Read(data1, 0, data1.Length);
В переменной bytes будет число фактически прочитанных байт из потока. А в массиве data1 будут сами прочитанные байты. Если прочитано меньшее число байт, чем длина массива data1, то будет заполнено только bytes первых членов массива. Оставшаяся часть массива останется без изменений.
Encoding.UTF8.GetString(data1, 0, bytes)
Метод Encoding.UTF8.GetString преобразует массив байт в строку. При этом используется одна из перегрузок этого метода, которая позволяет преобразовать в строку не весь массив, а только его часть, начиная с 0-го элемента и берущая из массива только bytes байт.
builder.Append
Этот метод добавляет в StringBuilder строку, полученную на предыдущем этапе.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.07.2016, 10:56
Помогаю со студенческими работами здесь

Вывод изображения через TCP\IP протокол
Всем привет ! У кого-нибудь есть примеры того, как получать видео, передаваемое посредством сетевого протокола TCP\IP ? У меня есть...

Обмен сообщениями через протокол Tcp
Приветствую, форумчане! Христос Воскресе!:) Собственно, задание: Напишите программу, которая при запуске устанавливает TCP соединение...

Обращение к modbus устройству через TCP протокол
Добрый день, написал TCP клиент, все работает. Подскажите пожалуйста как обратиться к устройству с командой "01 03 00 2e 00 01 e4...

Передача данных используя протокол TCP/IP
Есть код программы(не мой, из инета), позволяющий передавать файлы используя протокол TCP/IP. Может кто подскажет, есть ли возможность...

TCP протокол отправка данных на сервер
Я передаю с TCP клиента на сервер изображение и хочу передать его размер. Как лучше передавать на клиенте я делаю массив int (первый...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru