java.net.BindException: Address already in use:80 linux

本文记录了一次启动Apache Tomcat时遇到80端口被占用的问题,并提供了详细的排查和解决方案,包括如何查找占用端口的进程及终止该进程。

Jul 9, 2012 5:06:14 PM org.apache.catalina.core.AprLifecycleListener lifecycleEvent
INFO: The Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /usr/java/jdk1.5.0_22/jre/lib/amd64/server:/usr/java/jdk1.5.0_22/jre/lib/amd64:/usr/java/jdk1.5.0_22/jre/../lib/amd64
Jul 9, 2012 5:06:14 PM org.apache.coyote.http11.Http11BaseProtocol init
SEVERE: Error initializing endpoint
java.net.BindException: Address already in use:80
 at org.apache.tomcat.util.net.PoolTcpEndpoint.initEndpoint(PoolTcpEndpoint.java:298)
 at org.apache.coyote.http11.Http11BaseProtocol.init(Http11BaseProtocol.java:139)
 at org.apache.catalina.connector.Connector.initialize(Connector.java:1017)
 at org.apache.catalina.core.StandardService.initialize(StandardService.java:578)
 at org.apache.catalina.core.StandardServer.initialize(StandardServer.java:782)
 at org.apache.catalina.startup.Catalina.load(Catalina.java:504)
 at org.apache.catalina.startup.Catalina.load(Catalina.java:524)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:592)
 at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:267)
 at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:432)
Jul 9, 2012 5:06:14 PM org.apache.catalina.startup.Catalina load
SEVERE: Catalina.start
LifecycleException:  Protocol handler initialization failed: java.net.BindException: Address already in use:80
 at org.apache.catalina.connector.Connector.initialize(Connector.java:1019)
 at org.apache.catalina.core.StandardService.initialize(StandardService.java:578)
 at org.apache.catalina.core.StandardServer.initialize(StandardServer.java:782)
 at org.apache.catalina.startup.Catalina.load(Catalina.java:504)
 at org.apache.catalina.startup.Catalina.load(Catalina.java:524)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:592)
 at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:267)
 at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:432)
Jul 9, 2012 5:06:14 PM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 669 ms

 

解决方法如下:

 第一,使用如下命令查看哪个进程正在使用80端口:

netstat -nlutp

[root@zhang-12-07 bin]# netstat -nlutp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      3998/mysqld
tcp        0      0 :::80                       :::*                        LISTEN      27285/java
tcp        0      0 :::9009                     :::*                        LISTEN      27285/java
tcp        0      0 :::22                       :::*                        LISTEN      2112/sshd
udp        0      0 0.0.0.0:5353                0.0.0.0:*                               2157/avahi-daemon:
udp        0      0 0.0.0.0:54133               0.0.0.0:*                               2157/avahi-daemon:
udp        0      0 :::38051                    :::*                                    2157/avahi-daemon:
udp        0      0 :::5353                     :::*                                    2157/avahi-daemon:

第二,使用如下命令结束正在使用80端口的进程:

[root@zhang-12-07 bin]# kill -9  27285

再次查看,可以看到已经被kill了!
[root@zhang-12-07 bin]# netstat -nlutp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      3998/mysqld
tcp        0      0 :::22                       :::*                        LISTEN      2112/sshd
udp        0      0 0.0.0.0:5353                0.0.0.0:*                               2157/avahi-daemon:
udp        0      0 0.0.0.0:54133               0.0.0.0:*                               2157/avahi-daemon:
udp        0      0 :::38051                    :::*                                    2157/avahi-daemon:
udp        0      0 :::5353                     :::*                                    2157/avahi-daemon:

### Java网络编程中的`java.net.BindException: Address already in use`解决方案 当遇到`java.net.BindException: Address already in use`异常时,表明尝试绑定到特定IP地址和端口号的套接字失败,因为该组合已经被其他进程占用。此问题不仅限于TCP连接,在UDP通信中同样可能出现类似的错误信息[^2]。 #### 查找并终止占用端口的服务 对于Windows操作系统而言,可以利用命令行工具查找正在使用目标端口的应用程序,并考虑关闭不必要的服务或应用程序实例: ```powershell Get-Process -Id (Get-NetTCPConnection -LocalPort <PORT_NUMBER>).OwningProcess Stop-Process -Id (Get-NetTCPConnection -LocalPort <PORT_NUMBER>).OwningProcess -Force ``` 上述PowerShell脚本能够帮助定位并强制结束指定端口上的所有活动连接。请注意替换 `<PORT_NUMBER>` 为实际发生冲突的具体数值[^3]。 #### 修改应用配置避免端口冲突 如果确认是由于多个应用程序试图监听同一端口引起的问题,则应调整其中一个或几个应用程序的相关设置以改变其默认监听端口。例如,在IDEA项目中修改服务器启动参数;如果是Docker容器内部署的服务,可以通过编辑对应的YAML文件来更改暴露给宿主机映射的外部端口[^4]。 #### 调整系统级网络参数优化资源管理 针对某些情况下频繁创建短时间内的大量临时连接所引发的“Address already in use”,可通过调节操作系统的内核参数提高可用的最大用户端口范围以及加快TIME_WAIT状态下的socket回收速度。具体方法如下所示(适用于Linux环境): ```bash echo 'net.ipv4.ip_local_port_range = 1024 65000' >> /etc/sysctl.conf echo 'net.ipv4.tcp_tw_reuse=1' >> /etc/sysctl.conf sysctl -p ``` 而在Windows环境下则需通过注册表路径 `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters` 下新增DWORD类型的键值项 `MaxUserPort` 和 `TcpTimedWaitDelay` 来达到相似效果[^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值