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

Синхронизация подключенных клиентов

10.02.2023, 18:01. Показов 671. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе время суток

Подскажите, пожалуйста, как синхронизировать клиентов для работы в такте

Есть сервер
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
...
public event EventHandler<RequestRecieveEventArgs> RequestRecieve;
private readonly int _Port;
private Socket tcpListener;
...
private async void ListeningAsync()
        {
            var Listener = tcpListener;
            Socket tcpСlient = null;
 
            try
            {
                Console.SetCursorPosition(0, 2);
                Console.WriteLine($"Сервер (порт {_Port}) запущен. Ожидание подключений... ");
 
                while (_Enabled)
                {
                    tcpСlient = await Listener.AcceptAsync();
                    ProcessRequestAsync(tcpСlient);
                }
                            
            }
            catch (SocketException) { Console.WriteLine("Fatal error server...."); }
        }
  
        private async void ProcessRequestAsync(Socket client)
        {
            await Task.Run(() => RequestRecieve?.Invoke(this, new RequestRecieveEventArgs(client)));
        }
...
Его работу необходимо реализовать как то так:
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
 public static void Run()
        {
            Program.tcpServer.RequestRecieve += TcpServer_RequestRecieve;
            Program.tcpServer.Enabled = true;
 
            while (Program._WorkServer)
            {
                if (Program.Clients.Count != 0)
                {
                    //Установит все объекты синхронизации
 
                    ...
 
                    // Дождаться завершения всех задач в такте
                    ... 
                }
                else
                {
                    Thread.Sleep(100);
                }
            }
            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
        private static void TcpServer_RequestRecieve(object sender, RequestRecieveEventArgs e)
        {
 
            try
            {                
                var client = e.TcpClient;
                NetworkStream networkStream = new NetworkStream(client);
 
                while (Program.Work)
                {
                    List<DataPackage> dataPackages = DbWork._getDataTbl(Program.NRec);
                    
                    waitHandleThisClientStart.WaitOne();
 
                    if (dataPackages.Count != 0)
                    {
                        ...
                        // отправляем данные
                        networkStream.Write(response, 0, response.Length);
                        
                    }
                    else
                    {
                        byte[] buffer = { 0x00 };
                        networkStream.Write(buffer, 0, buffer.Length);
                    }
 
                    waitHandleThisClientStart.Reset();
                    waitHandleThisClientStop.Set();
                }
                
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.ToString());
                return;
            }
        }
Так вот я не представляю как привязать объекты синхронизации каждый к своему потоку(Клиенту)
Может что то типа: Dictionary<EndPoint, ManualResetEvent>()
Или как корректней организовать этот процесс
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.02.2023, 18:01
Ответы с готовыми решениями:

Узнать количество подключенных и отключённых TCP клиентов
Всем привет, помогите доделать программу мучаюсь с инфой о количестве подключенных клиентов 2ю неделю. Дали вот такую конструкцию, но...

Определить всех клиентов, подключенных к серверу в данный момент
суть в чем - надо вывести все подключенные в текущий момент клиенты к серверу. то есть если клиент отключился - то уже программа не...

Подсчитать количество подключенных клиентов к серверу в данный момент
Добрый день! Подскажите пожалуйста выход из ситуации. У меня есть ModbusTCP сервер, который очень похож на стандартный Socket, с такими...

6
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
10.02.2023, 22:37
Быть может вы сформулируете первоначальную задачу, а не то что вы хотите сделать?
Потому что есть предположение, что вы используете неправильные инструменты для решения вашей проблемы.
0
 Аватар для Kazbek17
1484 / 939 / 454
Регистрация: 06.02.2012
Сообщений: 2,868
11.02.2023, 23:32
Цитата Сообщение от MacksTiger Посмотреть сообщение
waitHandleThisClientStart.WaitOne();
Полностью согласен с IamRain, и чего ждем?

Добавлено через 32 секунды
Тут тупо копи паст
0
1 / 1 / 0
Регистрация: 11.05.2022
Сообщений: 28
14.02.2023, 15:29  [ТС]
Доброе время суток
Цитата Сообщение от IamRain Посмотреть сообщение
Быть может вы сформулируете первоначальную задачу...
А задача вот какая: есть n-операторов, на мониторы которых передается одна и та же информация в данный момент времени.
Операторы подключаются к серверу, а он, с определенным тактом (как мной задумано), отправляет информацию
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
14.02.2023, 15:39
Ну так просто пробегайтесь по таймеру по всем операторам и отправляйте информацию.
Можно использовать TPL чтобы callback быстрее отработал.
Зачем тут concurrent примитивы, непонятно..
0
1 / 1 / 0
Регистрация: 11.05.2022
Сообщений: 28
15.02.2023, 17:09  [ТС]
Цитата Сообщение от IamRain Посмотреть сообщение
Ну так просто пробегайтесь по таймеру по всем операторам и отправляйте информацию.
Каждый оператор - это отдельный поток с непрерывным циклом обмена. Как в этом случаии пробежаться по таймеру?
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
16.02.2023, 00:35
Цитата Сообщение от MacksTiger Посмотреть сообщение
Как в этом случаии пробежаться по таймеру?
Ясно, тогда вам нужно подразделять свои пакеты на два вида, скажем, RegularMessage (то, что на основе dataPackages уходит) и NotificationMessage (то что нужно выполнять по таймеру).
Отправлять, скажем, такие сообщения:
Header:
1. Тип сообщения (Regular or NotificationMessage) - byte.
2. Длина сообщения N - пусть будет int
Data:
1. Байты сообщения (N bytes)

И один [Async]ManualResetEvent, как у вас сейчас:
C#
1
2
//только переименуйте переменную
waitHandleThisClientStart.WaitOne();


Соответственно в событии по таймеру делать примерно так:
C#
1
2
3
4
5
6
7
8
9
var timer = new PeriodicTimer(TimeSpan.FromSeconds(2));
while (await timer.WaitForNextTickAsync(CancellationToken.None))
{
    waitHandleThisClientStart.Reset();
    // собрать всех клиентов и через TPL отправить сообщения
    var tasks = ....
    await Task.WhenAll(tasks);
    waitHandleThisClientStart.Set();
}
Ну и на клиенте правильно принять.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.02.2023, 00:35
Помогаю со студенческими работами здесь

Вывести список подключенных клиентов
Здравствуйте дорогие форумчане. Подскажите пожалуйста: 1. Как вывести список подключенных клиентов (для формы Клиенты) 2. И как клиенту...

Правильно обновить ListBox со списком подключенных клиентов
Всем доброго времени суток!) Помогите, в чём ошибка? У меня есть библиотека using System.Net.Sockets; public static...

Чат: показывать в ListBox список подключенных клиентов
Все уже перепробовал. ничего не получается...вот исходники чата с уже добавленным listbox. Надо чтобы при подключении пользователя, он...

Клиент-Сервер: отобразить на форме всех подключенных клиентов
Короче задача такая... Нужно сделать клиент-серверное приложение. На сервер должно быть консольное приложение которое будет получать всех...

Синхронизация DataGridView у клиентов
Есть два пользователя, на экраны которых выведен DataGridView, который в свою очередь получает информацию через DataReader из MySql. ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
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 и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru