У меня есть клиент, которому нужно прослушивать определенный порт для входящих широковещательных сообщений 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 сразу же может получать и обрабатывать пакеты, как обычно.
Может кто-нибудь пролить свет на то, что может быть здесь проблема, или что я могу сделать дальше, чтобы устранить эту проблему?
Большое спасибо.