【问题标题】:Why can't I use any Ports with Java.net? [duplicate]为什么我不能在 Java.net 中使用任何端口? [复制]
【发布时间】:2019-10-13 17:24:39
【问题描述】:

我正在尝试进行在线聊天,但是当我启动代码时,我总是得到 java.net.BindException: Address already in use (Bind failed)。我已经尝试过多次更改端口,但我总是得到相同的异常。有时代码仍然执行并且一切正常,但异常对我来说仍然是一个问题。我知道有与我类似的问题,但只有 Windows 用户的解决方案,我是 Mac 用户。代码如下(还没写完,错误出现在Server部分@new ServerSocket();

public Server(Client c) {

    try {
        ServerSocket serverSocket = new ServerSocket(65531);
        while (true) {
            Socket s = serverSocket.accept();
            new Thread() {
                @Override
                public void run() {
                    super.run();

                    try {
                        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(s.getInputStream()));
                        String message = bufferedReader.readLine();
                        System.out.println("Antwort vom Client: " + message);
                        c.receivedMessage(message);
                        System.out.println("Adresse: "+s.getInetAddress().toString());
                        System.out.println(s.getInetAddress().getHostAddress());
                        s.close();
                    } catch (Exception e) {

                    }
                }
            }.run();


        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

编辑:

我在应用程序运行前后和期间检查了端口,它只在运行时使用,所以服务器套接字有点工作,但我仍然得到一个异常

【问题讨论】:

  • 顺便说一句,new Thread().run() 有点毫无意义。你的意思是.start()
  • 我不知道。我是多线程的新手。这只是我从网站复制的代码。但是改变它并没有解决它(它也适用于运行。
  • 您是否尝试研究该异常试图告诉您什么?
  • 是的,这意味着该端口已被使用,但我检查了 Nmap,应该没有任何服务在其上运行
  • nmap 正在网络层从外部检查它。你应该检查你的进程列表

标签: java serversocket


【解决方案1】:

异常 java.net.BindException: Address already in use 试图告诉您 Java 应用程序正在尝试连接某个端口,但该端口已被其他进程使用,并且 JVM 绑定到该特定端口。

您需要找出哪个进程已经在使用该端口并在尝试连接到套接字之前将其终止。你可以这样做:

在 cmd 中输入以下内容(以管理员身份):

netstat -ano | findstr :<yourPortNumber>

然后你在识别PID后执行这个命令:

taskkill /PID <typeyourPIDhere> /F

再次运行第一个命令以确保进程已成功终止。如果上一个操作成功,您将得到一个空行。

阅读更多:https://javarevisited.blogspot.com/2011/12/address-already-use-jvm-bind-exception.html#ixzz5pCppM2qn

编辑:这是在 Mac 上终止进程的方法:

netstat -vanp tcp | grep <port number>

如果您使用的是 ma​​cOS El CapitanCentos 7,请参阅answer

【讨论】:

  • 我用的是mac,这个命令对我不起作用
  • 我已经更新了我的答案以提供适用于 Mac 的解决方案。
  • 我运行了这个命令,它给了我一个很长的输出,但异常仍然存在
【解决方案2】:

很可能该端口仍在使用中,因为之前运行了您的程序,并且您没有正确关闭套接字。因此,在错误或不完整的运行之后,套接字仍然打开,因此端口被使用。

也许您想了解try-with-resource 或添加finally,如果成功创建,请确保关闭您的套接字。

确保关闭所有正在运行的 java 进程和/或简单地重新启动您的 PC 以确保释放端口。然后编辑您的代码以正确处理端口关闭并重试。

【讨论】:

  • 应用程序可能仍在运行。它甚至可能是这个应用程序的前一个实例,仍在 IDE 的后台运行。
  • 我终止了应用程序,但它仍然无法工作
  • 究竟是什么不起作用,你仍然遇到同样的错误吗?
  • 仍然遇到同样的异常
猜你喜欢
  • 2018-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-19
  • 2020-04-02
  • 2014-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多