gpt4 book ai didi

Java DatagramSocket 在网络负载过重时停止响应

转载 作者:太空宇宙 更新时间:2023-11-04 08:19:33 24 4
gpt4 key购买 nike

我有一个客户端需要在特定端口上监听传入的 UDP 广播消息。我通过使用 1500 毫秒的 setSoTimeout 初始化绑定(bind)到端口的 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 应用程序立即能够像平常一样接收和处理数据包。

任何人都可以阐明这里可能存在的问题,或者我可以进一步采取哪些措施来解决此问题?

非常感谢。

最佳答案

也许是软件防火墙上的 UDP 洪水保护?

此外,UDP 在设计上就是一个不可靠的协议(protocol)。可能是网络层由于负载而丢弃数据包。

关于Java DatagramSocket 在网络负载过重时停止响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9802791/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com