下面的代碼可以重現該問題: INT errAt = -1;DatagramSocket類口岸後仍然使用關閉
try {
System.out.println("start...");
for (int i = 0; i < 4000; i++) {
errAt = i;
DatagramSocket result = new DatagramSocket(null);
result.bind(new InetSocketAddress(InetAddress.getLocalHost(), 9005));
result.close();
//System.out.println(i);
}
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
System.out.println("ErrAt: " + errAt);
e.printStackTrace();
} finally {
System.out.println("end...");
}
在我的電腦,我會看到「java.net.BindException:地址已在使用:無法綁定」運行後異常2K +倍。
我不知道,就是這意味着close方法並沒有立即關閉本機插座?
確實沒有在Windows上立即關閉套接字。 – 2011-12-29 05:48:25
鑑於您可以在失敗之前運行代碼約2000次,可能最有可能的問題是關閉和重新綁定是一種競爭條件(即Windows非常快速地執行操作,但在2000次之後,您遇到了您在它關閉之前嘗試重新綁定),或者您的Windows資源不足,因爲它沒有足夠快地清除它們。你是否發現當它失敗時會等待一小段時間,然後在失敗之前或之後對另一個套接字工作正常,是否似乎必須等待一段時間才能關閉每個套接字? – AntonyM 2011-12-29 17:51:13
我之所以問這個問題的原因是因爲如果它在大約2000個套接字後似乎失敗了,但是當你等待50ms之後再工作到另外2000個套接字時,那麼它可能只是一個競爭條件。如果它在2000個套接字之後失敗了,並且你發現你被限制爲可能每隔幾百毫秒或幾秒關閉和重新綁定一個套接字,那麼這就意味着Windows僅在超時之後才清理資源。如果它的第一個確定 - 你只需要等待+重試,如果它發生,如果第二你可能想要查找關於套接字清理的註冊表設置。請參閱代碼 – AntonyM 2011-12-29 17:56:07