startNodeManager端口被占用:java.net.BindException: Address already in use

本文介绍了当NodeManager启动遇到端口5576被占用的情况时的解决办法。提供了两种查询并终止占用端口进程的方法,包括使用lsof命令查找进程ID并通过kill命令结束进程,以及使用ps命令结合grep查找未正常关闭的NodeManager进程。
-bash-3.2$ ./startNodeManager.sh  >NodeManager1.log  & 
 

Nov 21, 2012 3:38:41 PM weblogic.nodemanager.server.AbstractServerManager log
INFO: Startup configuration properties loaded from "/soa_nas/soa_suite/Oracle/Middleware/user_projects/domains/soa_domain/servers/bam_server2/data/nodemanager/startup.properties"

java.net.BindException: Address already in use
        at java.net.PlainSocketImpl.socketBind(Native Method)
        at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:383)
        at java.net.ServerSocket.bind(ServerSocket.java:328)
        at java.net.ServerSocket.(ServerSocket.java:194)
        at java.net.ServerSocket.(ServerSocket.java:150)
        at weblogic.nodemanager.server.Listener.init(Listener.java:56)
        at weblogic.nodemanager.server.NMServer.start(NMServer.java:206)
        at weblogic.nodemanager.server.NMServer.main(NMServer.java:382)
        at weblogic.NodeManager.main(NodeManager.java:31)
Nov 21, 2012 3:38:41 PM weblogic.nodemanager.server.NMServer main
+ set +x
 
发现是 5576 这个NodeManager 的端口被占用了。 通过如下另种方式可以查询到process并kill:
方法一 :   #  lsof   -i   :5576  可以查看到占用端口5576的程序PID , kill  -9  PID 处理,再启动就不会报错了。
 
方法一: 如果NodeManager异常关闭导致未释放  ps  -ef | grep  NodeManager  。
 
备注:
 
netstat -anp       显示系统端口使用情况
lsof -i   :端口        显示占用该端口的进程情况
  

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-749681/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/35489/viewspace-749681/

```markdown 你遇到的错误: ``` 端口绑定失败:java.net.BindException: Address already in use: bind ``` 表示 **服务器尝试使用的端口(如 4331)已经被其他进程占用**,无法重复绑定。 --- ### 🔍 错误原因 当你运行服务器程序时,执行了类似: ```java server = new ServerSocket(4331); ``` 但系统提示该地址已被使用,说明 **端口 4331 正在被另一个程序监听** —— 很可能是你之前启动的同一个服务器实例没有完全关闭! 常见场景: - 前一次运行的服务器未正常退出(仍在后台运行) - 程序崩溃后端口未释放 - 多个服务尝试监听同一端口 --- ### ✅ 解决方法 #### ✅ 方法 1:终止占用端口Java 进程 ##### 步骤一:查找占用 `4331` 端口的进程 ID 打开命令行(CMD 或 PowerShell),输入: ```bash netstat -ano | findstr :4331 ``` 输出示例: ``` TCP 0.0.0.0:4331 0.0.0.0:0 LISTENING 12345 ``` 其中最后的数字 `12345` 是 **进程 PID** ##### 步骤二:结束该进程 继续输入: ```bash taskkill /PID 12345 /F ``` > 替换 `12345` 为你查到的实际 PID 成功后会提示: ``` 成功终止进程。 ``` 现在你可以重新运行服务器。 --- #### ✅ 方法 2:更换服务器端口号(快速绕过问题) 修改服务器代码中的监听端口为一个**当前未被使用的端口**,例如 `5000`、`8888`、`9999`: ```java // 修改前 server = new ServerSocket(4331); // 修改后 ✅ server = new ServerSocket(5000); ``` 同时客户端也必须同步更改端口: ```java // 客户端也要改! int port = 5000; // 而不是 4331 ``` ✅ 这是最简单避免冲突的方式,尤其适合调试阶段。 --- #### ✅ 方法 3:防止程序“假死”导致端口占用 Java 网络程序如果异常退出(比如直接关窗口),Socket 可能未关闭,导致端口处于 `TIME_WAIT` 状态。 建议在服务器代码中添加资源自动释放机制: ```java try (ServerSocket server = new ServerSocket(4331)) { System.out.println("正在监听..."); while (true) { Socket you = server.accept(); new ServerThread(you).start(); } } catch (IOException e) { System.out.println("服务器异常:" + e.getMessage()); } ``` 使用 try-with-resources 可确保即使出错也能释放端口。 --- #### ✅ 方法 4:检查是否有多个服务器实例在运行 有时你不小心启动了多个 `ServerItem.java` 实例,第二个就会报 `Address already in use`。 👉 务必确认只有一个服务器正在运行! --- ### 🧪 验证端口是否空闲的小技巧 用以下命令查看某端口是否被占用: ```bash netstat -ano | findstr :4331 ``` 如果没有输出,说明该端口目前空闲,可以安全使用。 --- ### ✅ 总结:如何解决和预防? | 操作 | 建议 | |------|------| | 🔹 查看占用进程 | `netstat -ano \| findstr :端口号` | | 🔹 结束占用进程 | `taskkill /PID XXXX /F` | | 🔹 更换端口号 | 改为 `5000`, `8888` 等冷门端口 | | 🔹 避免多实例 | 关闭所有旧窗口再重启服务 | | 🔹 使用 try-with-resources | 自动释放资源,减少残留 | --- ✅ 推荐你现在这样做: 1. 打开 CMD,运行: ```bash netstat -ano | findstr :4331 ``` 2. 如果有结果,记下 PID 并杀死它: ```bash taskkill /PID <你的PID> /F ``` 3. 或者干脆把服务器和客户端都改成 `5000` 端口,彻底避开冲突; 4. 再次运行服务器 → 再运行客户端。 👉 这样就能解决问题了! 如果还有疑问,请告诉我你使用的具体实验名称和端口号,我可以帮你定制解决方案。 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值