当前位置: 首页 > 面试题库 >

如何避免java.net.BindException:地址已在使用中

皇甫展
2023-03-14
问题内容

以下代码运行了1个小时,然后关闭:

public class Mp extends JWindow implements MouseListener, MouseMotionListener {
    public static Mp j;
  private int serverPort = 0;
  private ServerSocket serverSock = null;
  private Socket sock = null;

  public static void main(final String[] args) throws IOException, InterruptedException, Exception {
    j = new Mp();
    j.setVisible(true);
    j.waitForConnections();
  }

  public void waitForConnections() {
    while (true) {
      try {
        sock = serverSock.accept();
        System.out.println("[TCPMediaHandler]: Accepted new socket");
        TCPMediaHandler handler = new TCPMediaHandler(sock);
        handler.start();
      } catch (IOException e) {
        e.printStackTrace(System.err);
      }
    }
  }

  public Mp() throws IOException {
    this.serverPort = 38891;
    serverSock = new ServerSocket(serverPort);
    serverSock.setReuseAddress(true);
    //serverSock.setSoTimeout(500);
    //serverSock.setSoLinger(true, 0);
    System.out.println("[TCPMediaHandler]: Server started");      
        this.v1.setBackground(Color.BLACK);
    this.v1.addMouseListener(this);
    /* Close the window */
    this.addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent we) {
          System.exit(0); 
        }
      });
  }

当我重新运行同一件事时,它失败了java.net.BindException

$ java -cp /var/tmp/dist/Mp.jar test.Mp
Exception in thread "main" java.net.BindException: Address already in use
    at java.net.PlainSocketImpl.socketBind(Native Method)
    at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:353)
    at java.net.ServerSocket.bind(ServerSocket.java:336)
    at java.net.ServerSocket.<init>(ServerSocket.java:202)
    at java.net.ServerSocket.<init>(ServerSocket.java:114)
    at test.Mp.<init>(Mp.java)
    at test.Mp.main(Mp.java)

大约需要3至4分钟才能再次成功执行。关闭后如何使它立即工作?

跟进:

$ netstat | grep 38891
tcp       35      0 localhost:38891         localhost:37842         CLOSE_WAIT 
tcp        0      0 localhost:34955         localhost:38891         ESTABLISHED
tcp       32      0 localhost:38891         localhost:37824         CLOSE_WAIT 
tcp        0      0 localhost:38891         localhost:34955         ESTABLISHED

$ lsof -w -n -i tcp:38891
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
xdg-scree 5254  sun   29u  IPv4 231948      0t0  TCP *:38891 (LISTEN)
xdg-scree 5355  sun   29u  IPv4 231948      0t0  TCP *:38891 (LISTEN)
xdg-scree 5455  sun   29u  IPv4 231948      0t0  TCP *:38891 (LISTEN)
telnet    7058  sun    3u  IPv4 242987      0t0  TCP 127.0.0.1:34955->127.0.0.1:38891 (ESTABLISHED)
sleep     9002  sun   29u  IPv4 231948      0t0  TCP *:38891 (LISTEN)
sleep     9005  sun   29u  IPv4 231948      0t0  TCP *:38891 (LISTEN)
sleep     9008  sun   29u  IPv4 231948      0t0  TCP *:38891 (LISTEN)

问题答案:

您会看到setReuseAddress(true)的调用为时已晚,即在绑定引发异常之后。

您可以通过三个步骤创建一个未绑定的ServerSocket,使其可重用,然后将其绑定。

ServerSocket ss = new ServerSocket();
ss.setReuseAddress(true);
ss.bind(new InetSocketAddress(12345));


 类似资料:
  • 我试图在Ubuntu 12.04中运行以下命令 并得到以下错误 在检查8080端口时,输出是 我的问题 为什么我会犯错误,以及如何消除这个错误?

  • 服务器程序: 客户端程序: 当我执行这个程序时。我收到了这样的错误“java.net.BindException:地址已在使用中:JVM_Bind”但在它正常工作之前。有人能帮我解决这个问题吗?

  • 问题内容: 在Eclipse中,出现此错误: 我不知道为什么现在出现,但几个小时前就可以运行了。我需要重启机器吗?我如何深入了解它?我感谢任何提示或建议。 问题答案: 是的,你有另一个绑定到同一端口的进程。 每当我遇到JVM_BIND错误时,Windows Sysinternals的TCPView(仅Windows)都是我最喜欢的应用程序。它显示了哪些进程正在侦听哪个端口。它还提供了一个方便的上下

  • 我已经创建了一个quarkus快速启动项目 之后当我跑步时: 我收到以下错误: 错误的来源似乎是来自 我不确定它要绑定到哪个端口。我想是8080。 任何想法如何使用应用程序.properties覆盖默认端口? 我在windows上。 谢谢!

  • 问题内容: 失败:生成失败,发生异常。 出了什么问题:任务’:project-web:jettyRun’的执行失败。 java.util.concurrent.ExecutionException:java.net.BindException:使用中的地址错误:JVM_Bind 尝试:使用–stacktrace选项运行以获取堆栈跟踪。使用–info或–debug选项运行以获取更多日志输出。 建立失

  • 问题内容: 在我的机器上,以下代码在Eclipse中编译,但在Netbeans中引发异常。错误消息显示“线程“主”中的异常java.net.BindException:地址已在使用中”。 Netbeans中正确的配置是什么才能使此代码编译?问题似乎与我有两个主要职能有关。如果我开始运行其中一个应用程序,则第二个应用程序将无法启动,并引发上述异常。 服务器.java 客户端程序 问题答案: 实现我想