閱讀385 返回首頁    go 阿裏雲 go 技術社區[雲棲]


DatagramSocket.receive()方法無響應的解決

之前看網上說用發送命令行的方式獲取客戶端的mac地址,具體方法不複述了。

其中用到這個receive()方法,朋友在測試的時候發現會無響應,發現是window的係統防火牆開啟以後出現的。

無法保證每個用戶都是關閉係統防火牆的,所以看了一下api,發現一個解決方法。

直接貼代碼看吧

  1. DatagramSocket ds=new DatagramSocket();  
  2.   
  3.     DatagramPacket dpk = new DatagramPacket(tcpNs, tcpNs.length, InetAddress.getByName(ip), iRemotePort);  
  4.     ds.send(dpk);  
  5.     DatagramPacket dp = new DatagramPacket(buffer, buffer.length);  
  6.     try {  
  7.         //設置超時時間,2秒  
  8.         ds.setSoTimeout(2000);  
  9.         ds.receive(dp);  
  10.     } catch (Exception e) {  
  11.         return "";  
  12.     }  


DataRamSocket.setSoTimeout(2000);  就是這個方法了


API介紹如下,好了問題解決。

setSoTimeout

public void setSoTimeout(int timeout)
                  throws SocketException
啟用/禁用帶有指定超時值的 SO_TIMEOUT,以毫秒為單位。將此選項設為非零的超時值時,對此 DatagramSocket 調用 receive() 將隻阻塞此時間長度。如果超過超時值,將引發 java.net.SocketTimeoutException,雖然 DatagramSocket 仍舊有效。選項必須在進入阻塞操作前被啟用才能生效。超時值必須是 > 0 的數。超時值為 0 被解釋為無窮大超時值。

參數:
timeout - 指定的以毫秒為單位的超時值。
拋出:
SocketException - 如果底層協議出現錯誤,例如 UDP 錯誤。

最後更新:2017-04-03 19:06:48

  上一篇:go ubuntu11.10 刪除UNITY 側邊欄
  下一篇:go J2EE中RequestDispatcher.forward()和response.sendRedirect()的區別詳談