Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
62 / 187 / 31
Регистрация: 14.02.2013
Сообщений: 1,701

TCP IP сервер NET 8

29.12.2023, 13:36. Показов 1546. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всех с наступающим господа кодеры.
Из преведущих тем по рекомендациям завсегдатых гуру Шарпа перешёл на NET 8 и решил освоить Task, Async/Await и работу с коллекциями. Для закрепления темы писал сервер простенький без обработки исключений и проверки прочей лабуды.
Вот так понимаю работу асинхронных потоков. Но ведь скажем вызов метода await Accept_Async(); блокирует дальнейший поток до его полного завершения и допустим если клиент подключился то от него обязательно должно прийти любое сообщения что бы перезапустить await Accept_Async(); иначе другие клиенты не смогут подключится.

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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using System.Net.NetworkInformation;
using static System.Runtime.InteropServices.JavaScript.JSType;
using static WinFormsApp1.Form1;
namespace WinFormsApp1
{
    public partial class Form1 : Form
    {
 
        Dictionary<int, string> Soc_List_int_s = new Dictionary<int, string>();
        Dictionary<string, Socket> Soc_List_string = new Dictionary<string, Socket>();
        Dictionary<int, Socket> Soc_List_int = new Dictionary<int, Socket>();
        int port = 6198, Listen_soc = 3;
        
        Socket Soc;
        IPAddress[] Ipp;
        Encoding encCyr = CodePagesEncodingProvider.Instance.GetEncoding("windows-1251");
 
        public delegate void DelegAcceptAsync();
        public delegate void DelegReceiveAsync0();
        public delegate void DelegReceiveAsync1();
        public delegate void DelegReceiveAsync2();
        public Form1()
        {
            InitializeComponent();
        }
        private void OnApplicationExit(object sender, EventArgs e)                                      //Событие при закрытии программы
        {
            Soc.Close();
        }
        public void Form1_Load(object sender, EventArgs e)
        {
            Ipp = Dns.GetHostAddresses(Dns.GetHostName());
            comboBox1.Items.AddRange(Ipp);
            comboBox1.SelectedIndexChanged += Combo_Box_1;
            
        }
        public void Combo_Box_1(object sender, EventArgs e)                                 //Выполняет событие для выбора из выподающего списка comboBox1
        {
            listBox1.Items.Add("Сетевое устройство " + comboBox1.SelectedIndex);
        }
        
        public async void button1_Click(object sender, EventArgs e)
        {
                Soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                Soc.Bind(new IPEndPoint(Ipp[comboBox1.SelectedIndex], port));
                Soc.Listen(Listen_soc);
                listBox1.Items.Add("Сервер запущен. Порт слушает " + port);
 
            await Accept_Async();
        }
 
        
 
        string s;
        Socket Soc_Accept_Async;
        int Coun_client = 0;
        public async Task Accept_Async()
        {
            Soc_Accept_Async = await Soc.AcceptAsync();
            BeginInvoke(new DelegAcceptAsync(Deleg_Accept_Async));
        }
 
        public async void Deleg_Accept_Async()
        {
            s = ((IPEndPoint)Soc_Accept_Async.RemoteEndPoint).Address.ToString();
            Soc_List_string.Add(s, Soc_Accept_Async);
            Soc_List_int.Add(Coun_client, Soc_Accept_Async);
            Soc_List_int_s.Add(Coun_client, s);
            listBox1.Items.Add("Подключился клиент " + s + ". Номер " + Coun_client);
            
            if (Coun_client == 0)
                await Receive_Async_0();
                
            else if (Coun_client == 1)
                await Receive_Async_1();
 
            else if (Coun_client == 2)
                await Receive_Async_2();
 
            Coun_client++;
            await Accept_Async();
        }
 
        Socket Soc_Receive_Async_0;
        byte[] Byt_0 = new byte[1024];
        public async Task Receive_Async_0()
        {
            Soc_List_int.TryGetValue(0, out Soc_Receive_Async_0);
            await Soc_Receive_Async_0.ReceiveAsync(Byt_0, SocketFlags.Partial);
            BeginInvoke(new DelegReceiveAsync0(Deleg_Receive_Async_0));
        }
        public async void Deleg_Receive_Async_0()
        {
            string IP_S;
            Soc_List_int_s.TryGetValue(0, out IP_S);
            listBox1.Items.Add("От клиента " + IP_S + ". Данные >>>" + encCyr.GetString(Byt_0, 0, Byt_0.Length));
            await Receive_Async_0();
        }
 
        Socket Soc_Receive_Async_1;
        byte[] Byt_1 = new byte[1024];
        public async Task Receive_Async_1()
        {
            Soc_List_int.TryGetValue(1, out Soc_Receive_Async_1);
            await Soc_Receive_Async_1.ReceiveAsync(Byt_1, SocketFlags.Partial);
            BeginInvoke(new DelegReceiveAsync1(Deleg_Receive_Async_1));
        }
        public async void Deleg_Receive_Async_1()
        {
 
            string IP_S;
            Soc_List_int_s.TryGetValue(1, out IP_S);
            listBox1.Items.Add("От клиента " + IP_S + ". Данные >>>" + encCyr.GetString(Byt_1, 0, Byt_1.Length));
            await Receive_Async_1();
        }
 
        Socket Soc_Receive_Async_2;
        byte[] Byt_2 = new byte[1024];
        public async Task Receive_Async_2()
        {
            Soc_List_int.TryGetValue(2, out Soc_Receive_Async_2);
            await Soc_Receive_Async_2.ReceiveAsync(Byt_2, SocketFlags.Partial);
            BeginInvoke(new DelegReceiveAsync2(Deleg_Receive_Async_2));
        }
        public async void Deleg_Receive_Async_2()
        {
            string IP_S;
            Soc_List_int_s.TryGetValue(2, out IP_S);
            listBox1.Items.Add("От клиента " + IP_S + ". Данные >>>" + encCyr.GetString(Byt_2, 0, Byt_2.Length));
            await Receive_Async_2();
        }
 
    }
}
Вложения
Тип файла: zip Project.zip (119.3 Кб, 2 просмотров)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.12.2023, 13:36
Ответы с готовыми решениями:

Сервер TCP
Как можно запустить сервер TCP в отдельных потоках каждому из которых присвоен определенный порт из списка (допустим txt файла)

TCP/IP клиент-сервер
Подскажите пожалуйста, как реализовать взаимодействие клиентского и серверного приложения по протоколу TCP/IP, если работают они в разных...

многопоточный сервер TCP
Создал сервер TCP, но нужно его переделать на многопоточный, что-бы могло подключиться большое количество пользователей одновременно. Вот...

5
62 / 187 / 31
Регистрация: 14.02.2013
Сообщений: 1,701
29.12.2023, 22:28  [ТС]
Что то не совсем пойму как передать коллекцию
C#
1
List<byte> Byt_0 = new List<byte>();
в параметр метода
C#
1
await Soc_Receive_Async_0.ReceiveAsync(Byt_0, SocketFlags.Partial);
хотелось бы проверять коллекцию на отсутствие в ней данных.
0
62 / 187 / 31
Регистрация: 14.02.2013
Сообщений: 1,701
03.01.2024, 18:06  [ТС]
Ни кто не на что не ответил. Зажали инфу да? Ладно без сопливых освою Шарп, великий бог ШАРПА мне поможет. Или свалю на C++;
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16148 / 11269 / 2890
Регистрация: 21.04.2018
Сообщений: 33,135
Записей в блоге: 2
03.01.2024, 19:27
Цитата Сообщение от VladimirU Посмотреть сообщение
Ни кто не на что не ответил.
Поменьше токсичности.
Здесь же нет штатных работников.
У многих в эти дни есть более важные и интересные занятия чем лазанье по Форуму.

Добавлено через 9 минут
VladimirU, сразу пишу, что этой областью программирования я не занимаюсь.
Но судя по документации, что-то в таком духе должно быть:
C#
1
await Soc_Receive_Async_0.ReceiveAsync(new ArraySegment<byte>(Byt_0.ToArray()), SocketFlags.Partial);
Добавлено через 1 минуту
В первом ссобщении у вас Byt_0 - это массив. В таком случае преобразовании ToArray() не будет нужно.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
07.01.2024, 07:08
Понимание пока так себе. Хотя тут больше проблема с ООП в целом: попытка запихнуть в код формы логику работы сервера ничем хорошим не сулит.

У вас должен быть отдельный Server.cs приблизительно (прям вот супер урезаный пример, который использовать нельзя) такого вида
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
class Server
{
    TcpListener listener;
    bool running;
    List<TcpClient> clients;
 
    public Server()
    {
        var listener = new TcpListener();
        clients = new();
    }
 
    public Task Start()
    {
        running = true;
        listener.Start();
        return Task.Run(async () =>
        {
            while (running)
            {
                var client = await listener.AcceptTcpClientAsync();
                _ = NewSession(client);
                clients.Add(client);
            }
        });
    }
    public void Stop()
    {
        running = false;
        listener.Stop();
    }
 
    private Task NewSession(TcpClient tcpClient)
    => Task.Factory.StartNew(async () =>
    {
        var buff = new byte[1024];
        var stream = tcpClient.GetStream();
        while (running)
        {
            var count = await stream.ReadAsync(buff);
            // TODO: handling message
        }
        tcpClient.Close();
    });
}
И уже этот класс должен информировать UI (туже Form) об новых подключениях.
0
62 / 187 / 31
Регистрация: 14.02.2013
Сообщений: 1,701
07.01.2024, 15:45  [ТС]
Wolfdp, строк то кот наплакал но пока мне нифига не понятно. Зато есть что изучить.

Добавлено через 52 секунды
Wolfdp, вопросов конечно у меня тьма тьмущая но всему своё время.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.01.2024, 15:45
Помогаю со студенческими работами здесь

TCP клиент-сервер
Есть у кого нибудь простой работающий пример TCP соединения клиент-сервер допустим для отправки сообщений выложите пожалуйста. ...

TCP Proxy сервер
Здравствуйте, появилась потребность написать программу, которая бы пропускала через себя определённый TCP траффик с порта 2733. ...

Многопоточный TCP сервер
Доброго времени суток! Я уже долгое время пытаюсь написать сервер, который может принимать много соединений с многими клиентами...

TCP сервер, не выполняется BeginAccept
Разбираюсь с NET в шарпе. Набросал простенький TCP сервер на сокете собственно сервер запускается и спокойно к нему подключается TCP клиент...

TCP клиент-сервер через интернет
Ситуация такая: Есть два компа. На одном сервер на другом клиент. Все реализована на TcpListener/TcpClient. Клиент передает на...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru