【记一次Tomcat 端口被占解决思路及流程】

大家好,今天分享一个最近工作中遇到的、差点让我把键盘砸了的奇葩问题。希望我的血泪史能帮你省点头发。

一、案发现场:诡异的端口占用

故事是这样的:我最近正在用 IDEA 启动一个 Tomcat 项目,一切正常。突然手贱,在项目启动到一半的时候,直接把服务给停了。

然后…噩梦开始了。

我再次点击 Debug 启动,IDEA 直接甩给我一个大红脸:
在这里插入图片描述

Address already in use: bind!

端口 50835 被占用了!
奇怪的是,如果我用 Run 模式启动,就一切正常。只有 Debug 模式不行。

附上我的 Tomcat 配置,大家可以看下,JMXDebug 端口都是设置好的:
在这里插入图片描述
在这里插入图片描述

二、常规破案:三板斧全部失效

遇到端口占用,老司机的第一反应当然是祭出祖传三板斧:

第一斧:netstat 精准查找 + taskkill 强力击杀

# 查一下 50835 端口到底被哪个孙子占了
netstat -ano | findstr "50835"

结果……
在这里插入图片描述
好家伙,干净得像我月底的钱包! 根本没有任何进程占用这个端口。

第二斧:暴力清场,干掉所有 java.exe

我想,会不会是哪个 java 进程僵死了没显示出来?行,打开任务管理器,详细信息页签,找到所有 java.exe,挨个“结束任务”!
在这里插入图片描述
清场完毕,再次 Debug!结果,熟悉的红色错误又跳了出来。

我人傻了。端口明明没被占用,但系统就是说它被占用了。这难道是遇见“端口幽灵”了?

三、柳暗花明:揪出第一个嫌疑人

在抓狂了半天后,我开始冷静地回忆:我最近在电脑上装了啥新东西?毕竟之前一直好好的。

电光火石间,我想到了它——WSL2!

题外话:WSL2 是啥?
简单说,就是微软官方出的一个神器,让你能在 Windows 里流畅地跑一个真·Linux 系统,开发必备!

当时安装 WSL2 的时候,我手痒,在“启用或关闭 Windows 功能”里,除了 适用于 Linux 的 Windows 子系统,还顺手勾选了 Hyper-V
在这里插入图片描述

再提一嘴:Hyper-V 又是个啥?
它是微软亲儿子的虚拟机软件,跟 VMware、VirtualBox 是一类东西。

那这货跟端口占用有啥关系?

这就要说到它霸道的运行机制了。我这里打个比喻解释下:

你的电脑是家大酒店,端口 0-65535 就是酒店的所有房间。 你启动的程序(比如 IDEA)是散客,想住 50835 号房。 而
Hyper-V/WSL2/Docker 这类虚拟化工具,就是个超级旅行团。

酒店经理(Windows 系统)知道这个旅行团随时可能要用掉几十上百个房间,但又不确定具体是哪些。为了省事,经理干脆直接划出一整层楼(比如50000 到 51000 号房),挂上“团队预留,请勿打扰”的牌子。

这时,你这个散客(IDEA)跑来想住 50835 房,前台(系统)看了一眼:“抱歉,这间房被预留了,不可用!”
你很纳闷:“可我去看过了,里面明明没人啊!”(就像 netstat 查不到一样)。
但事实就是,房间确实不能用,因为它属于“预留区”,等着那个大旅行团随时入住。

恍然大悟!我打开“启用或关闭 Windows 功能”,取消勾选 Hyper-V重启电脑

再次启动项目,成功!

四、又来报错!

我天真地以为战斗到此结束。

结果,两天后,在我又一次项目启动途中又停掉 Tomcat 后,那个熟悉的红色错误,带着嘲讽的微笑,又双叒叕地跳了出来!

我彻底懵了。Hyper-V 不是已经被我关了吗?怎么还来?!

继续查资料,才找到原因:

在 Windows 系统里,Hyper-V
只是“虚拟化技术”这个黑帮家族的其中一个成员。你把它关了,但只要它的兄弟们还在活动,背后的大佬(底层虚拟化平台)就依然会去“预留端口”!

这个黑帮家族的成员包括:

WSL2 (Windows Subsystem for Linux 2):头号元凶!
虚拟机平台 (Virtual Machine Platform):WSL2 的基础,关了它 WSL2 就用不了。 Windows 虚拟机监控程序平台 Windows Sandbox
(沙盒) Docker Desktop for Windows:这货开机自启,是 WSL2 的好基友,它一启动就会自动唤醒 WSL2

终于知道原因了, 我虽然关了 Hyper-V 的管理勾选项,但因为我电脑上还装着 Docker Desktop,并且它是开机自启的!只要 Docker 一启动,就会拉起 WSL2,然后 Windows 底层就会预留一大片端口。

五、终极解决方案:打不过就加入

既然躲不过,那就只能正面刚了:

  1. 管理员身份 打开 CMDPowerShell。(切记,是管理员!)

  2. 输入以下命令,查看系统到底为你“预留”了哪些TCP端口范围:

 netsh interface ipv4 show excludedportrange protocol=tcp

回车后,我看到了这样一串列表:
在这里插入图片描述
注意看最后一行:50790 - 50889

而我那 Debug 端口 50835,不多不少,正好在这个预留端口范围里!

最终解决方法:

回到 IDEA 的 Tomcat 配置里,把 Debug 端口从 50835 改成一个不在任何预留范围内的端口号,比如 58888。

保存,启动,绿条飞起,项目成功运行!世界终于清净了!

总结一下 (太长不看版)

如果你也遇到了 IDEA (或其他程序) 端口被占用,但 netstat 又查不到进程的情况,
按以下步骤操作:

**1. 以 管理员 身份打开 CMD,输入

netsh interface ipv4 show excludedportrange protocol=tcp
  1. 查看输出的端口范围列表,确认你的端口号是不是掉进这些范围里了
  2. 如果是,别犹豫,换个端口号换一个不在这些范围里的端口,问题立马解决。**

这通常是由于你开启了 WSL2 / Docker / Hyper-V 等虚拟化功能导致的。

希望这篇血泪史能帮你快速定位问题,少走弯路!如果对你有帮助,点个赞不过分吧?(手动滑稽)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值