DatagramSocket.receive()方法無響應的解決
之前看網上說用發送命令行的方式獲取客戶端的mac地址,具體方法不複述了。
其中用到這個receive()方法,朋友在測試的時候發現會無響應,發現是window的係統防火牆開啟以後出現的。
無法保證每個用戶都是關閉係統防火牆的,所以看了一下api,發現一個解決方法。
直接貼代碼看吧
- DatagramSocket ds=new DatagramSocket();
- DatagramPacket dpk = new DatagramPacket(tcpNs, tcpNs.length, InetAddress.getByName(ip), iRemotePort);
- ds.send(dpk);
- DatagramPacket dp = new DatagramPacket(buffer, buffer.length);
- try {
- //設置超時時間,2秒
- ds.setSoTimeout(2000);
- ds.receive(dp);
- } catch (Exception e) {
- return "";
- }
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