簡體   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