版权声明:本文为 CSDN 用户「南国薏米」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zzlve/article/details/105450928
# 前面的话
因为安装 Windows 版本的 Docker 环境,开启了 Hyper-V。其结果是导致了 IDEA 在运行 Tomcat 的时候提示 1099 端口占用,经过探索之后成功找到了解决方案。
# 壹、原因分析
首先我们可以查看一下我们系统默认的端口占用范围:
netsh int ipv4 show dynamicport tcp
Microsoft Windows [版本 10.0.18363.752]
(c) 2019 Microsoft Corporation。保留所有权利。
C:\Users\Chirius>netsh int ipv4 show dynamicport tcp
协议 tcp 动态端口范围
---------------------------------
启动端口 : 1024
端口数 : 13977
1
2
3
4
5
6
7
8
9
我们可以看到 Windows 系统默认的 tcp 动态端口范围为:1024~13977。当我们开启 Hyper-V 后,系统默认会分配给一些保留端口供 Hyper-V 使用:
netsh interface ipv4 show excludedportrange protocol=tcp
C:\Users\Chirius>netsh interface ipv4 show excludedportrange protocol=tcp
协议 tcp 端口排除范围
开始端口 结束端口
---------- --------
1026 1125
1226 1325
1326 1425
1426 1525
1526 1625
2180 2279
我们可以看到 IDEA 运行 Tomcat 需要 JMX 的 1099 端口刚好在端口排除范围中,这样就导致了 IDEA 需要使用 1099 端口是会被占用,这样你当然就不能运行了。
# 贰、解决方法
使用管理员身份运行 cmd,重置端口,然后重启
C:\Users\Chirius>netsh winsock reset
这样你的 tcp 端口排除范围可能刚好不包含 1099 端口,这样你当然就可以用你的 IDEA 运行 Tomcat 应用了。但是你啥时候会出现就不得而知了。
# 叁、终极解决
# 3.1 关闭 Hyper-V
Microsoft Windows [版本 10.0.18363.752]
(c) 2019 Microsoft Corporation。保留所有权利。
C:\WINDOWS\system32>dism.exe /Online /Disable-Feature:Microsoft-Hyper-V
或者采用传统方式,在控制面板的 “程序和功能” 中,找到 “Windows 功能”,取消 Hyper-V 的勾选。这两种方法都会要求重启。
# 3.2 修改动态端口范围
使用管理员身份运行 cmd
C:\WINDOWS\system32>netsh int ipv4 set dynamicport tcp start=49152 num=16383
确定。
C:\WINDOWS\system32>netsh int ipv4 set dynamicport udp start=49152 num=16383
确定。
然后检查结果
C:\Users\Chirius>netsh int ipv4 show dynamicport tcp
协议 tcp 动态端口范围
---------------------------------
启动端口 : 49152
端口数 : 16383
# 3.3 开启 Hyper-V
C:\WINDOWS\system32>dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All
部署映像服务和管理工具
版本: 10.0.18362.1
映像版本: 10.0.18363.752
启用一个或多个功能
[==========================100.0%==========================]
操作成功完成。
重新启动 Windows 以完成该操作。
是否立即重新启动计算机? (Y/N)
或者采用传统方式,在控制面板的 “程序和功能” 中,找到 “Windows 功能”,取消 Hyper-V 的勾选。这两种方法都会要求重启。
# 后面的话
使用终极解决方案解决之后,你会发现你的 IDEA 又可以正常运行了。另外这里说一个单独排除端口的命令,后面可能会用到:
netsh int ipv4 add excludedportrange protocol=tcp startport=50051 numberofports=1
使用上面的命令之后我们就可以单独排除某个端口了,保障改端口不会被其他应用占用。