Hyper-V和IDEA運行端口占用問題


前面的話】因為安裝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

我們可以看到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)

開啟Hyper-V

或者采用傳統方式,在控制面板的“程序和功能”中,找到“Windows功能”,取消Hyper-V的勾選。這兩種方法都會要求重啟。

后面的話】使用終極解決方案解決之后,你會發現你的IDEA又可以正常運行了。另外這里說一個單獨排除端口的命令,后面可能會用到:

netsh int ipv4 add excludedportrange protocol=tcp startport=50051 numberofports=1

使用上面的命令之后我們就可以單獨排除某個端口了,保障改端口不會被其他應用占用。


薏米筆記


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM