以下代码可以重现该问题: int errAt = -1;
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...");
}
在我的 PC 中,运行 2k+ 次后,我将看到“java.net.BindException:地址已在使用:无法绑定(bind)”异常。
我不确定,这是否意味着关闭方法没有立即关闭 native 套接字?
最佳答案
即使我将此代码设置为运行 40,000 次迭代,此代码也能在我的 Mac 上运行。我认为这里可能的问题是套接字没有在 Windows 上立即关闭,但是您又试图在可能毫秒的空间内进行数千次迭代。
下面的代码会不断重试并 hibernate 一小段时间,让你看看是否是延迟问题,套接字会在一段时间内关闭:
long tCumulative = 0;
int errAt = -1;
System.out.println("start...");
for (int i = 0; i < 4000; i++) {
try {
errAt = i;
DatagramSocket result = new DatagramSocket(null);
result.bind(new InetSocketAddress(InetAddress.getLocalHost(), 9005));
result.close();
//success at last
tCumulative = 0;
} catch (Exception e) {
System.out.println("Error (at="+errAt+") (waited="+tCumulative+"ms): " + e.getMessage());
tCumulative+=50;
Thread.sleep(50);
i--;
}
}
System.out.println("end...");
关于java - DatagramSocket 关闭后端口仍在使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8663899/