gpt4 book ai didi

java - DatagramSocket 关闭后端口仍在使用

转载 作者:行者123 更新时间:2023-11-29 03:51:18 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com