Java DatagramSocket перестает отвечать при большой загрузке сети - PullRequest
1 голос
/ 21 марта 2012

У меня есть клиент, которому нужно прослушивать определенный порт для входящих широковещательных сообщений UDP.Я выполняю это, инициализируя объект DatagramSocket, связанный с портом, с setSoTimeout 1500 мс.

while (true) {
    try{
        DatagramSocket datagramSocket = new DatagramSocket(PORT);

        byte[] buffer = new byte[BUFF_LEN];
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

        datagramSocket.receive(packet);

        [handoff packet to internal buffer to await processing]

    } catch (SocketTimeoutException timeout) {
      ...
    } catch [other exceptions]
}

Это довольно учебник, и все отлично работает;однако во время недавнего теста сетевой нагрузки я обнаружил, что мое приложение не получало определенные дейтаграммы, и проблема усугублялась по мере перегрузки сети.

Копая дальше, я обнаружил, что тайм-аут срабатывает каждый раз, когда вызывается .receive () - почти как если бы в порт ничего не поступало. Однако запуск Wireshark на той же машине показывает, что это не так , и правильно сформированные пакеты ожидаемого размера и содержимого приходят как обычно.Каким-то образом дейтаграммы просто не попадали на уровень приложений.

Уменьшение сетевого трафика немедленно облегчает эту проблему, и приложение Java сразу же может получать и обрабатывать пакеты, как обычно.

Может кто-нибудь пролить свет на то, что может быть здесь проблема, или что я могу сделать дальше, чтобы устранить эту проблему?

Большое спасибо.

Ответы [ 3 ]

1 голос
/ 21 марта 2012

UDP защита от наводнений на программном брандмауэре, возможно?

Кроме того, UDP по своей природе ненадежный протокол.Возможно, сетевой уровень отбрасывает пакеты из-за нагрузки.

0 голосов
/ 23 марта 2012

Я не часто программирую на Java, поэтому, может быть, я что-то здесь упускаю, но почему вы вызываете new DatagramSocket внутри цикла? Кажется, что это создаст новый сокет для каждой дейтаграммы, который быстро истощит системные ресурсы.

0 голосов
/ 22 марта 2012

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

...