Windows 端口被占用
问题的解决过程
今天碰到了一个很诡异的端口占用问题。
项目使用的端口是 9052,在启动的时候出现了下面的提示。
Description:
Web server failed to start. Port 9052 was already in use.
Action:
Identify and stop the process that's listening on port 9052 or configure this application to listen on another port.
这是一个很常见的端口占用问题,通过下面的命令就能解决了。
netstat -aon | findstr "9052"
taskkill /T /F /PID 1234
但是,在我执行 netstat -aon | findstr "9052" 之后,什么都没有输出。
奇了怪了,不应该呀。然后用 TCPView 搜索 9052 端口占用情况,也什么都没有输出。
然后我把我的问题丢给了 AI。
netstat -ano | findstr 9052 查找不到占用 9052 的应用程序,但是在启动 springboot 的时候,出现了以下提示,我应该如何排查问题? 找出占用 9052 的应用程序?
Description:
Web server failed to start. Port 9052 was already in use.
Action:
Identify and stop the process that's listening on port 9052 or configure this application to listen on another port.
AI 给了我一些的建议
-
用管理员运行 cmd,然后再主席
netstat命令 -
使用 TCPView 软件查看
-
检查是否是被 IPv6 占用
netstat -ano -p tcp | findstr 9052
netstat -ano -p tcpv6 | findstr 9052 -
使用 PowerShell 执行下面的命令 (好使)
Get-NetTCPConnection -LocalPort 9052 | Format-Table -Property LocalAddress, LocalPort, State, OwningProcess
# 然后查看进程详情
Get-Process -Id <PID>得到下面的输出
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
2865 686 227392 34016 204.83 16184 1 Foxmail
最后查出来是 FoxMail 占用了 9052 端口。
思考
那现在的问题是为什么 netstat 没有结果输出, Get-NetTCPConnection -LocalPort 9052 却可以找到占用 9052 端口的应用呢?
我继续向 AI 追问。
为什么 netstat -ano | findstr 9052 没有结果输出,而 Get-NetTCPConnection -LocalPort 9052 | Format-Table -Property LocalAddress, LocalPort, State, OwningProcess 却可以找出占用 9052 端口的应用?
AI 的解释是 2 个命令的工作原理不一样。
netstat 比较老,是从 TCP/IP 协议栈的缓存中读取数据,数据不是实时的,有刷新延迟。在某些情况下,短连接或者刚建立的连接可能不会立即显示。
Get-NetTCPConnection 直接查询内核, 更准确及时。
还有一个问题,Tcpview.exe 也是从内核中读取数据,为什么当时我也没有找到呢?
继续向 AI 追问
那为什么 Tcpview.exe 没有读取到数据,Get-NetTCPConnection -LocalPort 9052 | Format-Table -Property LocalAddress, LocalPort, State, OwningProcess 却读到了数据?
AI 给出了几个可能的原因:
- Tcpview.exe 设置不对,如监听的协议,过滤器等设置的有问题。

- TCPView 的刷新时机问题,虽然都是从内核读取数据,但是 Tcpview.exe 还是会有刷新时间间隔的。默认是 1 秒。
- 没有以管理员权限启动 Tcpview.exe, 但是却以管理员权限启动 PowerShell。
- 使用问题,我在搜索的时候只输入了
9052,但是 TCPView 的显示可能是*:9052. 我应该输入:9052
但是现在这个问题已无法复现了,无法得知具体是哪一个原因。只能等到后续这个问题再次出现才能知道原因了。
那么,如果这个问题再次出现,我应该如何执 行什么命令,来确定它的根本问题?
继续就这个问题向 AI 追问。
由于 netstat -ano | findstr 9052 和 TCPView 查询不出数据,Get-NetTCPConnection -LocalPort 9052 | Format-Table -Property LocalAddress, LocalPort, State, OwningProcess 却可以找出占用 9052 端口的应用的问题已无法复现,那么下次这个问题再次出现,我应该执行什么命令来确定这个问题的根本原因?
AI 给我返回了一个 .ps1 文件,是的,一个 .ps1 文件,之前我从来没有接触过 ps1 的任何语法。
我粗略的看了下这个 .ps1 文件,用到的语法大概是定义变量/方法,执行方法,搭配一些 if-else 语句。
然后我给 AI 提问,让它给我介绍下这些语法。
我之前从来没接触过 ps1 脚本请向我解释 ps1 中如何定义变量,方法,如何执行方法,if-else 语句的语法。