有时候当我重启以下应用程序(基于Java、Struts、Mysql和Jboss 4.05版本),会出现错误:Address already in use: JVM_Bind
我所知道的唯一修复方法是重新启动机器并再次尝试,它就可以工作了。 否则,有时我按Ctrl-Alt-Del并停止所有与Java相关的进程,这也有时有效。
但是确切的原因是什么,我们该如何防止这个问题发生?
有时候当我重启以下应用程序(基于Java、Struts、Mysql和Jboss 4.05版本),会出现错误:Address already in use: JVM_Bind
我所知道的唯一修复方法是重新启动机器并再次尝试,它就可以工作了。 否则,有时我按Ctrl-Alt-Del并停止所有与Java相关的进程,这也有时有效。
但是确切的原因是什么,我们该如何防止这个问题发生?
地址已在使用中: JVM_Bind
表示另一个应用程序已经在监听您当前应用程序尝试绑定的端口。
您需要做的是,要么为您当前的应用程序更改端口,或者更好的方法是找到已经运行的应用程序并将其关闭。
在Linux上,您可以使用以下命令找到应用程序的进程ID:
netstat -tulpn
在 Windows 上,在提升权限的 cmd/ps 中
net stop winnat
那么
net start winnat
重置Windows的NAT服务,从而移除故障侦听器。此方法适用于大多数“无法在此端口上侦听”的错误,例如Docker、JVM等。
通常当我使用JBoss服务器时,会遇到端口已被占用的情况。
常见罪犯:
要更改JBoss 4.2.x绑定自身的端口,请转到:
"C:\jboss4.2.2\server\default\deploy\jboss-web.deployer\server.xml"
这里"default"是服务器实例,更改此处的端口:
<Connector port="8080" address="${jboss.bind.address}" >
在上面的示例中,端口绑定为8080。
打开命令行并输入:netstat -a -o -n
或 tasklist
以查看当前正在运行的进程。
找到与Java相关的端口并输入:taskkill /F /PID <您的PID号码>
。
点击Enter键。
MySql和JBoss可能会监听同一个端口吗?
错误信息中是否有指定端口号,例如Address already in use: JVM_Bind:8080
?
您可以更改JBoss server.xml中的端口以进行测试。
TL;DR;
检查您想打开的端口是否被保留(即使没有应用程序打开它)
在Windows上:
netsh interface ipv4 show excludedportrange protocol=tcp
解释:
至少在Windows上,“java.net.BindException: Address already in use: JVM_Bind”的另一个可能原因是操作系统“保留”了该端口。
如果您使用此主题中其他答案中的命令,则会告诉您没有应用程序正在侦听该端口,但是您无法打开它。
一些Windows更新像这样的保留了一段范围的端口,因此无法再由进程声明。
尽管未明确说明无法打开的端口,但更新说明提到了可以帮助排除问题的命令:
netsh interface ipv4 show excludedportrange protocol=tcp
这将产生一个被阻止的端口范围列表:
Protocol tcp Port Exclusion Ranges
Start Port End Port
---------- --------
5357 5357
49709 49808
49809 49908
49909 50008
50009 50108
50109 50208
50280 50379
* - Administered port exclusions.
这也可能是由于在..\tomcat\conf\server.xml中端口8080的双重定义引起的:
<Connector port="8080"
enableLookups="false" redirectPort="8443" debug="0"/>
<Connector port="8080"
enableLookups="false" address="127.0.0.1" maxParameterCount="30000"/>
这个错误意味着你正在尝试在另一个ServerSocket
已经使用的端口上创建一个新的ServerSocket
。因此,请尝试关闭您所知道的所有套接字和连接,并确保您的应用程序完全终止。还要检查是否有另一个由您的程序启动的进程。