修改Hyper-V動態端口范圍


1. 問題

1.1. 現象

因為使用Windows 10中的WSL 2功能需要啟用Hyper-V,其結果是導致了IDEA在啟動的時候提示端口被占用。

錯誤信息如下:

Internal error. Please refer to http://jb.gg/ide/critical-startup-errors

java.net.BindException: Address already in use: bind
    at java.base/sun.nio.ch.Net.bind0(Native Method)
    at java.base/sun.nio.ch.Net.bind(Net.java:461)
    at java.base/sun.nio.ch.Net.bind(Net.java:453)
    at java.base/sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:227)
    at io.netty.channel.socket.nio.NioServerSocketChannel.doBind(NioServerSocketChannel.java:132)
    at io.netty.channel.AbstractChannel$AbstractUnsafe.bind(AbstractChannel.java:551)
    at io.netty.channel.DefaultChannelPipeline$HeadContext.bind(DefaultChannelPipeline.java:1345)
    at io.netty.channel.AbstractChannelHandlerContext.invokeBind(AbstractChannelHandlerContext.java:503)
    at io.netty.channel.AbstractChannelHandlerContext.bind(AbstractChannelHandlerContext.java:488)
    at io.netty.channel.DefaultChannelPipeline.bind(DefaultChannelPipeline.java:984)
    at io.netty.channel.AbstractChannel.bind(AbstractChannel.java:247)
    at io.netty.bootstrap.AbstractBootstrap$2.run(AbstractBootstrap.java:355)
    at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163)
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:416)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:515)
    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:918)
    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
    at java.base/java.lang.Thread.run(Thread.java:834)

1.2. 查看原因

首先查看一下我們系統默認的端口占用范圍;

netsh int ipv4 show dynamicport tcp

結果如下:

Microsoft Windows [版本 10.0.19041.388]
(c) 2020 Microsoft Corporation. 保留所有權利。

C:\Users\Test>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\Test>netsh interface ipv4 show excludedportrange protocol=tcp

協議 tcp 端口排除范圍

開始端口 結束端口


1026 1125
1226 1325
1326 1425
1426 1525
1526 1625
2180 2279
... ...

1.3. 問題結論

IDEA需要在端口6942~6991間找到一個可用端口並綁定(bind),往后面看可以看到端口這個端口范圍在排除范圍內

這樣就導致了IDEA需要使用的端口是被占用,這樣你當然就不能運行了。

2. 處理方案

2.1. 方法一:重置端口

使用管理員身份運行cmd,重置端口,然后重啟

netsh winsock reset

這樣你的tcp端口排除范圍可能剛好不包含1099端口,這樣你當然就可以用你的IDEA運行Tomcat應用了。但是你啥時候會出現就不得而知了。

2.2. 方法二:修改動態端口范圍(推薦)

以下步驟需要使用管理員權限操作

2.2.1. 關閉Hyper-V

# 關閉Hyper-V
dism.exe /Online /Disable-Feature:Microsoft-Hyper-V

2.2.2. 修改動態端口范圍

使用管理員身份運行cmd

# 設置動態端口TCP范圍
netsh int ipv4 set dynamicport tcp start=51555 num=13980
# 設置動態端口UDP范圍
netsh int ipv4 set dynamicport udp start=51555 num=13980

然后檢查修改結果

# 查看動態端口范圍
netsh int ipv4 show dynamicport tcp

輸出結果如下:

協議 tcp 動態端口范圍


啟動端口 : 51555
端口數 : 13980

2.2.3. 開啟Hyper-V

# 啟用Hyper-V
dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All

輸出結果如下:

部署映像服務和管理工具
版本: 10.0.18362.1

映像版本: 10.0.18363.752

啟用一個或多個功能
[100.0%]
操作成功完成。
重新啟動 Windows 以完成該操作。
是否立即重新啟動計算機? (Y/N)

3. 常用操作

# 禁用Hyper-V
dism.exe /Online /Disable-Feature:Microsoft-Hyper-V
# 啟動Hyper-V
dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All

# 顯示動態端口范圍
netsh int ipv4 show dynamicport tcp
# 顯示例外端口范圍
netsh interface ipv4 show excludedportrange protocol=tcp

# 設置動態端口TCP范圍
netsh int ipv4 set dynamicport tcp start=51555 num=13980
# 設置動態端口UDP范圍
netsh int ipv4 set dynamicport udp start=51555 num=13980

# 添加例外端口
netsh int ipv4 add excludedportrange protocol=tcp startport=50051 numberofports=1

參考

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

IDEA啟動報錯-java.net.BindException: Address already in use: bind


免責聲明!

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



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