DatagramSocket временно прекращает получение пакетов (Java)

StackOverflow https://stackoverflow.com/questions/8314174

  •  25-10-2019
  •  | 
  •  

Вопрос

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

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

Эндрю

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top