У меня есть клиент, которому необходимо прослушивать конкретный порт для входящих сообщений широковещательной передачи UDP. Я выполняю это путем инициализации объекта DatagramSocket, привязанного к порту, с помощью setSoTimeout 1500 мс.Java DatagramSocket перестает отвечать на тяжелую нагрузку на сеть
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 сразу же может получать и обрабатывать пакеты, как обычно.
Может кто-нибудь пролить свет на то, что может быть проблемой здесь, или что я могу сделать дальше для устранения этой проблемы?
Большое спасибо.
Может ли это быть так, если wirehark регистрирует входящие данные просто отлично? Часы Гуглинга появляются только у одного парня, у которого такая же проблема, как и я - только его условия запуска разные. http://social.technet.microsoft.com/Forums/en/winserverTS/thread/06a33876-fb45-4bfe-90c2-d27a27e48e3f – Gary
Если честно, я не знаю. Вы могли бы использовать фол драйверов, жуткий сетевой карты, смешную версию ОС или что-то еще. Учитывая, что ваш является связанным с нагрузкой и воспроизводимым, и не зная, как Wireshark действительно считывает данные, я бы сказал, что это скорее всего какое-то брандмауэр или дросселирование. – mcfinnigan