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

标签 java sockets udp

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

相关文章:

java - Spring Boot自定义分页参数

java - 为方法调用的异步执行创建自定义 "Asynch"注释是个好主意吗?

python - 实时 Bokeh 套接字python

java - 如何向 x 次 TCP 客户端请求 TCP 服务器数据?

c# - UDP数据传输比TCP慢

java - 在UDP Socket Java Android上发送多个数据

java - 文件最后一行的 EOFException 的 datainputstream

java - 使用 Java 和 JavaFX 设置 WebView 中的文本颜色

Ruby TCPSocket write 不起作用,但是 puts 可以吗?

python - 使用发送命令时,“L3PacketSocket”对象没有属性 'ins'