2012-03-21 23 views
1

我有一個客戶端需要偵聽特定端口上的UDP廣播消息。我通過使用setSoTimeout爲1500ms初始化綁定到端口的DatagramSocket對象來實現此目的。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應用程序可以像往常一樣立即接收和處理數據包。

任何人都可以解釋一下這裏可能存在的問題,或者我可以做些什麼來解決這個問題?

非常感謝。

回答

1

軟件防火牆上的UDP防洪功能可能嗎?

此外,UDP是一種不可靠的設計協議。可能是網絡層因加載而丟棄數據包。

+0

如果wireshark記錄入站數據就好了,這仍然可以嗎? Google的營業時間只有一個人和我有同樣的問題 - 只有他的觸發條件不同。 http://social.technet.microsoft.com/Forums/en/winserverTS/thread/06a33876-fb45-4bfe-90c2-d27a27e48e3f – Gary 2012-03-21 14:51:52

+0

說實話我不知道。您可能會遇到司機,flakey網卡,有趣的操作系統修訂版或其他任何問題。鑑於你的負載相關性和可重複性,並且不知道Wireshark如何實際讀取數據,我敢打賭這很可能是某種防火牆或節流解決方案。 – mcfinnigan 2012-03-21 15:05:59

0

如果數據包到達主機,它們仍然可以被主機丟棄,如果套接字發送緩衝區已滿,這發生在應用程序無法跟上輸入時發生。

0

我不經常使用Java編程,所以也許我在這裏錯過了一些東西,但是爲什麼你要在循環中調用new DatagramSocket?看起來這會爲每個數據報創建一個新的套接字,這會很快耗盡系統資源。

+0

哎呀。我怪我的僞代碼。實際的代碼定義了一次套接字。無論如何,謝謝你指出。 – Gary 2012-04-23 07:00:29