解决端口占用问题
2026/1/29大约 2 分钟
解决端口占用问题
在开发过程中(尤其是使用 Spring Cloud、Nacos 等中间件时),经常会遇到端口启动失败的问题。主要分为两种情况:端口被其他进程占用 和 端口被系统保留(Hyper-V/Docker)。
情况一:端口被其他进程占用
报错通常提示 Address already in use: bind。
1. 查找占用进程
打开终端(CMD 或 PowerShell),输入以下命令查看端口(以 8848 为例):
netstat -ano | findstr 8848如果输出如下,说明端口被 PID 为 12345 的进程占用:
TCP 0.0.0.0:8848 0.0.0.0:0 LISTENING 123452. 结束进程
使用 taskkill 命令强制结束该进程:
taskkill /F /PID 12345情况二:端口访问权限被禁止 (Excluded Port Range)
这是你遇到的情况。报错提示如下:
bind: An attempt was made to access a socket in a way forbidden by its access permissions.
这通常不是因为有进程在使用该端口,而是因为 Hyper-V、WSL 或 Docker 保留了一部分动态端口范围,而你的端口(如 8848)不幸落在这个范围内。
1. 确认端口是否被保留
运行以下命令查看系统保留的端口范围:
netsh interface ipv4 show excludedportrange protocol=tcp如果你发现 8848 在某个 开始端口 和 结束端口 的范围内(例如 8833 - 8932),那么就是这个问题。
2. 解决方法
方法 A:重启 WinNAT 服务(推荐,由于端口随机分配,重启后通常会改变范围)
以 管理员身份 运行 PowerShell,执行以下两条命令:
net stop winnat
net start winnat执行完后,再次启动你的程序通常就能解决了。
方法 B:配置持久化排除(永久解决)
如果重启无效,或者你想永久保留该端口不被 Hyper-V 征用,可以手动将其加入排除列表:
- 先停止 WinNAT 服务:
net stop winnat - 显式排除你需要的端口(例如 8848):
netsh int ipv4 add excludedportrange protocol=tcp startport=8848 numberofports=1 - 重启 WinNAT 服务:
net start winnat
