如何解决“java.net.BindException:Address in in use:JVM_Bind”错误?

问题描述 投票:146回答:17

在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
17个回答
127
投票

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

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


2
投票

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

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

但是一旦它对我不起作用。我发出命令

$ lsof -i:[port] 

它没有显示任何内容。

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

希望我的经历能帮助一些人。


1
投票

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

很容易重启你的机器,如果可能:)


1
投票

重启电脑一次,我认为它会起作用。它开始在我的案例中工作。还有一件事可以去任务管理器并结束这个过程。

Screenshot for the reference.


0
投票

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


0
投票

您的端口必须在其他进程中忙碌。因此,您可以在https://technet.microsoft.com/en-us/sysinternals/bb897437上下载TCPView并终止使用端口的进程。

如果您不知道您的端口,请双击未启动的服务器,然后单击“打开服务器属性页”并单击左列中的glassfish。你会在这里找到这些端口。


0
投票

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

$ lsof -i:[port]

(2)另一个原因是ipv6使用的端口,解决方案:

编辑/etc/sysctl.conf

将其添加到文件中

net.ipv6.conf.all.disable_ipv6 = 1

然后使它生效

$ sudo sysctl -p /etc/sysctl.conf

或者只是重启


0
投票

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

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


0
投票

如果您是Linux用户,则需要关闭端口然后键入

fuser -k 8080/tcp

168
投票

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

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

然后用kill <pid>杀死进程


95
投票

在窗户中

netstat -ano

将列出所有协议,端口和进程监听。使用

taskkill -pid "proces to kill" /f

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

 taskkill -pid 431 /f

31
投票

在Mac中:

杀死进程终端:kill <pid>

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

来自Diego Pino的回答


27
投票

在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来强行停止这个过程。

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


14
投票

(仅限Windows)

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

通过运行命令:

netstat -ano | findstr :yourPortNumber

As shown in picture below

你将获得你的进程ID(PID),现在杀死相同的进程运行此命令:

taskkill /pid yourid /f

enter image description here


7
投票

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

你可以尝试杀死你的任务管理器中运行的一个java.exe服务 - ps确保你不要杀掉eclipse,因为它也被列为java.exe。如果没有别的办法,重启你的机器无论如何都会解决它。看起来您没有关闭先前测试的套接字。希望这可以帮助。


4
投票

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

C:> netstat -a -o

- 显示所有连接

-o显示进程标识符

然后终止进程。


4
投票

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

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

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.