下面的代码可以重现该问题: 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