DatagramSocket временно прекращает прием пакетов (Java) - PullRequest
2 голосов
/ 29 ноября 2011

Я запрограммировал в Lua плагин для игры, которая отправляет информацию об игроке через пакет UDP (512 байт) на удаленный сервер, который считывает данные из пакета и объединяет всю информацию об игроке в XML-файл (который затем может бытьпросматривается в сети всеми игроками, чтобы они могли видеть текущее состояние друг друга).

Я запрограммировал сервер на Java, используя DatagramSocket для обработки входящих пакетов, однако я заметил странное поведение.Через определенный промежуток времени DatagramSocket временно прекращает принимать соединения примерно на 10-12 секунд, а затем снова возобновляет нормальное поведение (исключений не видно, что я вижу).Определенно существует связь между тем, как часто клиенты отправляют пакеты, и тем, как быстро это происходит.Если я увеличу частоту обновления клиентов, DatagramSocket быстрее «выйдет из строя».

Возможно, стоит упомянуть, но каждый полученный пакет порождает поток, который обрабатывает данные в пакете.Я запускаю сервер на Linux, если это имеет значение!

Кто-нибудь знает, что может быть причиной такого поведения?

Эндрю

Ответы [ 3 ]

3 голосов
/ 29 ноября 2011

Моя гипотеза заключается в том, что у вас заканчивается буфер приема на стороне сервера.

Возможно, вы захотите пересмотреть свой дизайн: порождение потока - довольно дорогая операция. Выполнение этого для каждого входящего пакета привело бы к системе с относительно низкой пропускной способностью, которая могла бы легко объяснить, почему очередь на получение наращивается.

Также см. Указание размера буфера приема UDP во время выполнения в Linux

P.S. Я уверен, что вы уже знаете, что UDP не гарантирует доставку сообщений, поэтому я не буду разбираться с этим.

3 голосов
/ 29 ноября 2011

UDP - это сетевой протокол, абсолютно не гарантирующий доставку.Любой сетевой компонент в любом месте пути (включая клиентский и серверный ПК) может принять решение об отбрасывании пакетов по любой причине, например, при высокой нагрузке или перегрузке сети.

Это означает, что вам придется потратить немноговыяснить, где происходит потеря пакета.Вы можете использовать что-то вроде wireshark, чтобы увидеть, поступают ли пакеты на сервер вообще.

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

1 голос
/ 29 ноября 2011

Запуск потока для каждого UDP-пакета - плохая идея TM .Серверы UDP традиционно кодируются как простые циклы приема (в конце концов вам нужен только один сокет).Таким образом, вы избегаете всех накладных расходов на потоки, синхронизацию и тому подобное.

...