Многопоточный сервер Udp: перенаправление полученных данных в потоки - PullRequest
0 голосов
/ 17 сентября 2018

поэтому я впервые пишу сервер и клиент udp для игры 1 на 1. Моя идея состоит в том, чтобы сервер обрабатывал первые установленные подключения и создавал новый поток каждый раз, когда 2 новых игрока подключаются, чтобы обрабатывать все коммуникации между ними. Типичное клиентское сообщение будет иметь threadIndex (у меня есть массив потоков), playerId (от какого игрока оно пришло) и все, что им нужно сделать.

Можно ли получить пакет во всех потоках и проанализировать, предназначен ли он для них? Будет ли это эффективно? Как мне подойти к этому?

1 Ответ

0 голосов
/ 17 сентября 2018

Подходящий подход зависит от характера задач сервера, но создание нового потока для каждой пары игроков, вероятно, не лучшая идея. В основном давайте представим, что ваш сервер в основном выполняет:

  1. Задачи, связанные с вводом / выводом. Другими словами, большую часть времени он ждет некоторого ввода-вывода opertiton - сетевой ответ, запрос к базе данных или работа с диском. В в этом случае вам, вероятно, понадобится асинхронная модель, когда все ваши соединения обрабатываются в одном потоке. Было бы эффективно потому что вы на самом деле не имеете ничего общего в своем собственном коде. Я полагаю Скорее всего, у вас есть задачи, связанные с вводом / выводом. Например, вам просто нужно направлять сообщения между игроками и выталкивать \ извлекать некоторые данные из БД. Все перенаправленные сообщения будут иметь идентификатор игры (между слоями), поэтому вы никогда не пропустите ни одного из них, и они не будут пропущены. Взгляните на это видео , чтобы увидеть идеи и цели асинхронного подхода.

  2. Задачи, связанные с процессором. Здесь сервер должен что-то вычислять, выполнять сложные алгоритмы или обрабатывать огромное количество данных. В этом случае вам, вероятно, понадобится многопоточность, но опять-таки поток на пару игроков может оказаться не самым подходящим подходом, потому что он плохо масштабируется и потребляет слишком много ресурсов. Если у вас есть тяжелые задачи процессора, попробуйте отправить их в очередь с набором фоновых рабочих. А затем отправлять сообщения асинхронно. Взгляните на реализацию производитель-потребитель с BlockingCollection .

У вас может быть комбинация из двух случаев, и, конечно, вы можете комбинировать подходы, описанные выше. Также см. Вопросы 1 , 2 , 3 . Попробуйте вернуться с конкретными вопросами. Надеюсь, это поможет.

...