繁体   English   中英

Java DatagramSocket在繁重的网络负载下停止响应

[英]Java DatagramSocket stops responding under heavy network load

我有一个客户端,需要在特定端口上侦听传入的UDP广播消息。 我通过使用setSoTimeout为1500ms初始化绑定到端口的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在设计上是不可靠的协议。 网络层可能由于负载而正在丢弃数据包。

如果数据包到达主机,如果套接字发送缓冲区已满,主机仍可以将其丢弃,这是在应用程序无法跟上输入的情况下发生的。

我不经常用Java编程,所以也许我在这里缺少一些东西,但是为什么要在循环中调用new DatagramSocket 似乎这将为每个数据报创建一个新的套接字,这将很快耗尽系统资源。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM