我有一個客戶端需要偵聽特定端口上的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應用程序可以像往常一樣立即接收和處理數據包。
任何人都可以解釋一下這裏可能存在的問題,或者我可以做些什麼來解決這個問題?
非常感謝。
如果wireshark記錄入站數據就好了,這仍然可以嗎? Google的營業時間只有一個人和我有同樣的問題 - 只有他的觸發條件不同。 http://social.technet.microsoft.com/Forums/en/winserverTS/thread/06a33876-fb45-4bfe-90c2-d27a27e48e3f – Gary 2012-03-21 14:51:52
說實話我不知道。您可能會遇到司機,flakey網卡,有趣的操作系統修訂版或其他任何問題。鑑於你的負載相關性和可重複性,並且不知道Wireshark如何實際讀取數據,我敢打賭這很可能是某種防火牆或節流解決方案。 – mcfinnigan 2012-03-21 15:05:59