【问题标题】:How do I resolve the "java.net.BindException: Address already in use: JVM_Bind" error?如何解决“java.net.BindException:地址已在使用:JVM_Bind”错误?
【发布时间】:2012-09-26 01:56:42
【问题描述】:

在 Eclipse 中,我收到此错误:

run:
     [java] Error creating the server socket.
     [java] Oct 04, 2012 5:31:38 PM cascadas.ace.AceFactory bootstrap
     [java] SEVERE: Failed to create world : java.net.BindException: Address already in use: JVM_Bind
     [java] Java Result: -1
BUILD SUCCESSFUL
Total time: 10 seconds

我不确定它为什么现在出现,但它在几个小时前运行良好。我需要重新启动机器吗?我怎样才能找到它的底部?我很感激任何提示或建议。

【问题讨论】:

标签: java eclipse networking serversocket


【解决方案1】:

您有另一个进程在同一个端口上运行。

您可以尝试终止在您的任务管理器中运行的 java.exe 服务之一 - ps 确保您没有终止 eclipse,因为它也被列为 java.exe。如果没有其他工作,重启你的机器无论如何都会修复它。看起来您没有关闭先前测试的套接字。希望这会有所帮助。

【讨论】:

    【解决方案2】:

    如果您知道进程正在运行哪个端口,您可以键入: lsof -i:<port>

    例如,lsof -i:8080,列出在端口 8080 上运行的进程 (pid)。

    然后用kill <pid>杀死进程

    【讨论】:

    • 是的,这就是 linux。然后在 Windows 中尝试类似的东西。也许这可以帮助:stackoverflow.com/questions/15708/lsof-equivalent-for-windows
    • 所以我正在使用 Raspbian,它说:bash:lsof:找不到命令。有什么建议吗?
    • @MonaJalal 嗯不确定,但也许可以试试sudo apt-get install lsof
    • @DiegoPino 我面临同样的错误java.net.BindException: Address already in use (Bind failed) 我使用了lsof -i:8080 并得到了tcp6 0 0 :::8080 :::* LISTEN 106872/java。我该怎么办 ?杀死java??
    • @AvijitBarua 绑定到此端口的 java 程序的进程 id (pid) 是 106872。您启动的每个 Java 程序都将自己显示为程序 java(它是运行您编译的 java 虚拟机代码)。所以是的,如果它不是某个关键(系统)工具,而是您自己的程序,您可以退出或杀死这个 java 程序;看看像htop 这样的任务管理器。也许您尝试绑定到不应被终止的有效程序使用的端口。
    【解决方案3】:

    该端口已被其他进程使用,因为@Diego Pino 说你可以在 unix 上使用 lsof 来定位进程并杀死相应的进程,如果你在 Windows 上使用 netstat -ano 来获取所有的 pid进程和每个人都获得的端口。搜索你想要的端口并杀死。

    如果可能的话,只需重新启动您的机器即可:)

    【讨论】:

      【解决方案4】:

      是的,您有另一个进程绑定到同一个端口。

      Windows SysinternalsTCPView(仅限 Windows)是我最喜欢的应用程序,每当我遇到 JVM_BIND 错误时。它显示哪些进程正在侦听哪个端口。它还提供了一个方便的上下文菜单来终止进程或关闭阻碍的连接。

      【讨论】:

      • 快速解决方法:打开服务器视图 > 双击服务器 > 更改使用的端口号(即用于 Tomcat 管理员、HTTP/1.1 和 AJP/1.3)
      • @novice_developer netstat 是您正在寻找的命令,带有 -a 和 -p 选项,man netstat 是您的朋友 :)
      • 如果上述过程不起作用,请重新启动PC一次,我认为它会起作用。它开始在我的情况下工作。
      【解决方案5】:

      在 Mac 中:

      杀死进程 终端:kill <pid>

      查找 pid: 终端:lsof -i:<port>

      来自迭戈皮诺的回答

      【讨论】:

      • kill 在 mac 上不起作用,kill -9 和我一起工作
      【解决方案6】:

      在窗口中

      netstat -ano
      

      将列出所有正在监听的协议、端口和进程。 使用

      taskkill -pid "proces to kill" /f
      

      杀死监听端口的进程。 例如

       taskkill -pid 431 /f
      

      【讨论】:

      • netstat -ano |查找“您的端口号”在 Windows 上将其用于特定端口。
      • 对我来说(使用 Windows 10)find 不起作用,但 findstr 起作用。为了避免误报,它也有助于在前面加上冒号,例如netstat -ano | findstr :8080。完成此操作后 - 假设它返回 1234 的 PID - 如果您想查找此进程的名称,可以通过 tasklist /fi "pid eq 1234" 完成。
      【解决方案7】:

      在 Windows CMD 行中,通过输入以下命令找出在绑定端口上保持连接的进程 ID:

      C:> netstat -a -o

      -a 显示所有连接

      -o 显示进程标识符

      然后终止进程。

      【讨论】:

        【解决方案8】:

        Ubuntu/Unix 中,我们可以分两步解决这个问题,如下所述。

        1. 输入netstat -plten |grep java

          这将给出类似的输出:

          tcp   0   0 0.0.0.0:8080   0.0.0.0:*  LISTEN   1001  76084  9488/java       
          

          这里8080 是java 进程正在侦听的端口号,9488 是它的进程ID (pid)。

        2. 为了释放被占用的端口,我们必须使用kill 命令杀死这个进程。

          kill -9 9488
          

          9488 是之前的进程 ID。我们使用-9 强制停止进程。

        您的端口现在应该是空闲的,您可以重新启动服务器。

        【讨论】:

        • 我正在数字海洋中配置 CentOs 服务器。如果我终止此进程,我该如何再次运行服务器?
        • 只有当它是你自己的程序并且你没有任何数据可以在那里丢失时才使用 -9。它不干净地杀死进程,-15 告诉程序自行退出。
        【解决方案9】:

        当我先启动服务器程序然后启动客户端程序时打开两个控制台时,我在 Eclipse 中遇到了类似的问题。我曾经在单个控制台中停止程序,以为它已经关闭了服务器,但它只关闭了客户端而不是服务器。我在我的任务管理器中发现了正在运行的 Java 进程。通过从各自的控制台关闭服务器和客户端程序解决了这个问题(Eclipse 显示了最新活动程序的控制台)。因此,当我再次启动 Server 程序时,端口再次打开以被捕获。

        【讨论】:

          【解决方案10】:

          您的端口必须在某个其他进程中处于忙碌状态。所以你可以在https://technet.microsoft.com/en-us/sysinternals/bb897437 上下载 TCPView 并终止使用端口的进程。

          如果您不知道您的端口,请双击未启动的服务器,然后单击打开服务器属性页面,然后单击左栏中的 glassfish。您将在此处找到端口。

          【讨论】:

            【解决方案11】:

            (1) 检查端口是否在使用,杀死该进程

            $ lsof -i:[端口]

            (2)另外一个原因是ipv6使用了端口,解决方法:

            编辑/etc/sysctl.conf

            将此添加到文件中

            net.ipv6.conf.all.disable_ipv6 = 1

            然后让它生效

            $ sudo sysctl -p /etc/sysctl.conf

            或者直接重启

            【讨论】:

              【解决方案12】:

              对于那些正在寻找最简单的答案(我们通常会错过)的人,只需停止您正在运行的项目并重新开始它。 大多数时候我们所做的是忘记停止我们之前运行的项目,当我们重新运行项目时,它会显示这样的问题。

              我还附上了一张照片以使其更清晰(我使用“弹簧工具套件”)。 所以你需要做的是要么点击最右边的按钮,如果你想重新启动同一个项目,或者首先点击右边第二个按钮来停止你的项目,然后点击最左边的按钮来运行你的项目。我希望这将解决少数新程序员的问题。 :)

              【讨论】:

                【解决方案13】:

                是的,正如 Guido Simone 所说,因为另一个进程正在监听同一个端口。如果你在 Ubuntu 中,你可以简单地杀死那个进程给出命令 sudo kill $(sudo lsof -t -i:[port number])

                例如:sudo kill $(sudo lsof -t -i:8080)

                但是一旦它对我不起作用。 我下了命令

                $ lsof -i:[port] 
                

                它什么也没显示。

                我使用命令检查了我的 docker 容器 docker ps -a 但没有一个是活着的。所有容器都已停止 (但我记得,几分钟前我停止了一个使用相同端口的容器。)。为了确保 docker 不是原因,我使用命令 sudo service docker stop 停止整个 docker 进程并重试。 令人惊讶的是,当时eclipse并没有显示错误。它完美地运行了我的程序。

                希望我的经验能帮到一些人。

                【讨论】:

                  【解决方案14】:

                  这意味着其他进程已经在使用该端口。如果此端口正被其他一些关键应用程序使用并且您不想关闭该应用程序,则更好的方法是选择任何其他可免费使用的端口。

                  将您的应用程序配置为使用任何其他免费端口,您将看到您的应用程序正常工作。

                  【讨论】:

                    【解决方案15】:

                    重启电脑一次,我认为它会工作。它开始在我的情况下工作。可以做一件事去任务管理器并结束进程。

                    【讨论】:

                    • 请不要回答评论/问题。最好把它删掉。
                    【解决方案16】:

                    (仅限 Windows)

                    要杀死一个进程,您首先需要找到进程 ID (pid)

                    通过运行命令:

                    netstat -ano | findstr :yourPortNumber
                    

                    您将获得您的进程 ID (PID),现在要终止同一个进程,请运行以下命令:

                    taskkill /pid yourid /f
                    

                    【讨论】:

                      【解决方案17】:

                      你需要关闭你的端口 如果您是 linux 用户,请输入

                      fuser -k 8080/tcp
                      

                      【讨论】:

                        【解决方案18】:

                        在我的例子中,Tomcat 在后台运行。我在使用 Eclipse 时将其安装为外部 servlet。 使用 Intellij 中的 Spring Boot,它有自己的服务器,但在已被占用时无法启动。
                        在我的情况下,Tomcat 自动启动我打开我的操作系统,这就是为什么我需要手动关闭他:

                        $ sudo service tomcat stop
                        

                        当然,“tomcat”取决于您使用的 tomcat 版本。
                        希望它可能对某人有所帮助。

                        【讨论】:

                          【解决方案19】:

                          适用于窗户

                          1. 查找进程ID

                            netstat -nao |找到“8080”

                          它将以数字形式显示进程 ID。

                          示例

                          TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       18856
                          

                          这里18856是进程ID

                          1. 杀死该进程

                            taskkill /PID 18856 /F

                          输出:成功:PID 18856 的进程已终止。

                          这里使用 taskkill 你正在杀死进程 ID :18856

                          适用于 linux/Mac

                          sudo kill -9 $(sudo lsof -t -i:8080)
                          

                          在这里你可以找到使用sudo lsof -t -i:8080 的进程并通过 sudo kill 命令杀死它

                          【讨论】:

                            【解决方案20】:

                            您可以关闭每个 Java 进程并重新启动您的应用程序:

                            taskkill /F /IM java.exe
                            

                            再次启动您的应用...

                            【讨论】:

                              【解决方案21】:

                              当另一个进程已经在指定端口(8080)中运行时,会出现此 BindException。

                              您可以使用以下任何一种方法。

                              1. 更改服务器端口:如果你使用的是Tomcat服务器和IntelliJ IDE,可以通过配置tomcat服务器来配置服务器端口

                              • 转到 tomcat>conf 文件夹
                              • 编辑 server.xml
                              • 搜索“连接器端口”
                              • 用您的端口号替换“8080”
                              • 重启 tomcat 服务器。
                              1. 杀死该端口中现有正在运行的进程并启动服务器。

                              适用于 Linux/Mac

                              sudo kill -9 $(sudo lsof -t -i:8080)
                              

                              适用于 Windows

                              netstat -ano | findstr :8080
                              taskkill /PID typeyourPIDhere /F 
                              

                              注意:(/F强制终止进程)

                              【讨论】:

                                猜你喜欢
                                • 2015-10-30
                                • 1970-01-01
                                • 2018-03-12
                                • 2014-11-02
                                • 1970-01-01
                                相关资源
                                最近更新 更多