换系统、部署新服务、把开发机上的程序挪到服务器——win10服务器端口号怎么看这类问题,听起来就是敲一条命令,真排查起来才发现,难的不是「看」,是看完了怎么把那个端口定位到具体的进程。
我把本机的端口占用从 netstat 一路查到进程名完整走了一遍,包括几个只有踩过才知道的细节,下面按我实际的步骤记下来。
环境声明:下面这些命令我在 Windows 10 22H2 上、用系统自带的 PowerShell 5.1 和网络命令实测过;Python 实验用的是 3.13.12。Linux 上的对等命令只作对照,具体参数以你本机发行版为准。时间截至 2026 年 10 月。
先分清楚一件事:你要的到底是「这台机器正在监听哪些端口」,还是「某个具体端口被哪个进程占了」。这两件事用的命令完全不一样,混着查会绕半天。
| 全局监听清单 | netstat -ano 或 Get-NetTCPConnection -State Listen | 想知道机器开了哪些口子 |
| 单端口归属 | netstat -ano | findstr :<端口> 或 Get-NetTCPConnection -LocalPort <端口> | 服务起不来,提示端口被占 |
判断标准很简单:如果是「服务起不来,说端口被占」→ 用 netstat -ano | findstr :<端口> 那条;如果只是想巡检机器开了哪些端口 → 用 netstat -ano 整条。本文重点讲端口被占用之后的定位。
一、先拿到端口和 PID
说白了,定位端口占用,要拿的总是「端口 → PID」,PID 才是能直接下手的东西。我用本机真实在跑的 MySQL 举例,netstat 过滤 3306 端口:
TCP 0.0.0.0:3306 0.0.0.0:0 LISTENING 25432
TCP [::]:3306 [::]:0 LISTENING 25432
尾列 25432 就是占用该端口的进程 ID。注意同一端口会同时出现在 0.0.0.0(IPv4)和 [::](IPv6)两行,这是正常的,不要当成两个占用。
按微软 Get-NetTCPConnection 官方文档的写法,PowerShell 里可以更精准地只取这一行:
Get-NetTCPConnection –LocalPort 3306 | Select-Object LocalAddress,LocalPort,State,OwningProcess
我跑出来的结果是:
LocalAddress LocalPort State OwningProcess
:: 3306 Listen 25432
说到 win10服务器端口号怎么看,我习惯先用 netstat 那一列 PID 锁定目标,再用 PowerShell 精准过滤,两步都不会漏。关键在尾列 OwningProcess,它就是 PID。拿到 PID,下一步才有意义。
二、PID 再翻成进程名
光有 PID 还不够直观,得知道它到底是什么程序。我用 Get-Process 把 25432 翻出来:
Get-Process –Id 25432 | Select-Object Id,ProcessName,Path
真实回显里 ProcessName 是 mysqld——也就是说 3306 被本机 MySQL 占着,这本身是正常占用,不是冲突。我的建议是:定位到进程名之后,先确认它是不是「本来就该占该端口的服务」,再决定下一步动不动它。
三、两种报错原文,别混为一谈
端口相关的报错,我在这台机器上各触发了一遍,两条原文长得很像,但根因完全不同。
OSError: [WinError 10048] 端口被占用
我在 Python 里先后 bind 同一个端口,第二次直接抛:
OSError: [10048] 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。
这是你启动一个监听服务时才会遇到的错。含义很直白:同一个 IP:端口组合上已经有一个监听套接字,第二个起不来。常见场景是上一次程序没退干净、或者另一个服务已经占了 3306/8080 这类常用口。
ConnectionRefusedError: [WinError 10061] 连接被拒绝
这是去连别人时遇到的,原文是:
ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。
我实测下来,它和 10048 完全不是一回事:10061 的意思是「那个端口上根本没有任何程序在监听」。也就是对方服务没起、端口填错、或者中间的安全组/防火墙把连接挡掉了。容易看错的地方:很多人把 10061 当成「端口被占」,其实正相反——它是「端口空着,没人接」。
一个反直觉:Windows 没有特权端口
Linux 上绑定 1024 以下的端口需要 root,这是常识。我顺手在 Windows 上用普通用户 bind 了 999 端口,结果直接成功,没有任何报错。注意一个细节:Windows 的套接字实现里没有「特权端口」这一概念,普通用户也能绑低位端口。所以你在 Linux 上习惯性的「权限不够用 sudo」,挪到 Windows 服务器上并不成立,别拿老经验套。
四、什么时候不该直接 kill 占用进程
容易被忽略的一点是:看到端口被占,急着杀进程往往是错的。这几种情况我建议先停手:
- 占用者是 System(PID 4):它占着 445、5357 这类系统端口,杀掉等于动系统根基,千万别碰。
- 占用者是服务本身:比如 mysqld 占 3306、nginx 占 80,这是正常归属。该改的是你那个冲突的新程序,不是它。
- 云上端口不通:先去查安全组,而不是登进实例杀进程——安全组拦掉的包根本到不了系统防火墙这一层。
- 容器或共享环境:端口可能被平台组件占着,你没有权限也没必要动。
这处坑不复杂,但一定会被忘:先分清楚「谁占的」,再决定「动不动」。
五、云上端口不通,要分三层看
讲到云服务器,端口排查必须多算一层——这也是 win10服务器端口号怎么看 之外,真正决定外部能不能连上的关键。一台云上的实例,外部请求能不能通,取决于三层是否都放行,改错层等于白改:
| 安全组(云厂商侧) | 虚拟防火墙,控制实例级出入流量 | 入方向没加对应端口规则 |
| 系统防火墙(实例内) | Windows Defender Firewall / iptables / firewalld | 规则默认拒绝,服务端口没放行 |
| 监听(进程) | 服务程序是否真的在监听该端口 | 服务没起,或绑了 127.0.0.1 只听本地 |
三家云的安全组机制高度一致,都是「有状态的虚拟防火墙」,但具体入口和默认策略略有差别。按阿里云 ECS 安全组文档,入方向规则在控制台安全组页配置(官方文档);按腾讯云安全组概述文档,安全组是有状态的虚拟防火墙(官方文档);按华为云 ECS 安全组文档,默认未加规则时拒绝所有流量,加规则立即生效(官方文档)。排查时我的顺序永远是:先看安全组入方向有没有放端口,再进实例看系统防火墙,再确认服务监听地址是不是 0.0.0.0 而不是只绑了回环。
六、端口占用排查清单
按这套顺序走,基本不会漏:
FAQ
win10服务器端口号怎么看? 用 netstat -ano 看全部监听端口和对应 PID,或用 Get-NetTCPConnection -State Listen 只看监听态;想查单个端口就 netstat -ano | findstr :端口号。
服务器端口被占用怎么解决? 先按上面的步骤拿到 PID 并确认进程名,确认不是系统或正常服务后,停掉冲突程序,或者给新启动的服务换一个端口。不要上来就杀 PID 4 这类系统进程。
怎么查看端口被哪个进程占用? netstat -ano 的尾列是 PID,再 Get-Process -Id <PID> 或 tasklist | findstr <PID> 翻成进程名;PowerShell 也可以一行 Get-NetTCPConnection -LocalPort <端口> 直接拿到 OwningProcess。
连接提示由于目标计算机积极拒绝无法连接怎么办? WinError 10061 表示目标端口上没有任何程序在监听。先确认服务是否启动、端口号是否填错,云上还要确认安全组入方向是否放行了该端口,和「端口被占」是两码事。
windows服务器端口号怎么看命令是什么? 和 Win10 一致:netstat -ano、Get-NetTCPConnection。服务器版多了角色服务,但底层命令相同;远程连不上的优先查安全组与远程桌面/SSH 端口是否放行。
顺序总结
定位端口占用的链路就一条:netstat 拿 PID → Get-Process 翻进程名 → 判断该不该动 → 云上再查安全组与系统防火墙。
回到 win10服务器端口号怎么看 本身,命令其实只有一条 netstat,难的永远在后面那几步。端口这事的难点从来不是「看端口号」这条命令,而是看完了能不能分清「谁占的、该不该动、不通卡在哪一层」。把上面三步和三层记牢,比收藏一堆命令有用。
本文命令以 Windows 10 / PowerShell 5.1 实测为准;Linux 与各家云控制台的菜单路径以官方文档当期版本为准,遇到差异请以你本机环境核实。


