☰
Windows 端口被占用怎么办:查 PID、确认进程,再处理冲突
2026/10/8 2:11:29 网站建设 项目流程

启动本地服务遇到 Address already in use,先查监听地址、端口和进程,再决定关闭自己的重复服务还是更换端口。本文面向 Windows 开发者,以 TCP 为例,用 PowerShell 定位 PID,并通过 Python 实验验证占用和释放。不会把所有绑定失败都归因于“端口被占用”。

文章目录

    • 1. 先核对错误类型与运行位置
    • 2. 在 VS Code 打开正确的终端
    • 3. 查询监听,再检查拥有它的进程
    • 4. 确认冲突后,按场景处理
    • 5. 最小复现:占用一个动态端口,再释放
    • 6. 最后确认应用真的恢复

1. 先核对错误类型与运行位置

WinError 10048是本次 Windows 重复绑定实验的错误码;Linux 常见的 Errno 98、Node 的 EADDRINUSE 在文本上不同,不能照搬系统专用命令。

记录应用实际绑定的地址、端口和协议。TCP 与 UDP 需要分别检查;本文的 Get-NetTCPConnection 只查询 TCP。Docker、WSL 与宿主 Windows 也可能处于不同网络环境,应用在哪一层绑定,就先查那一层。

权限拒绝、端口保留和地址不存在可能导致其他绑定错误;没有看到监听进程时,不要立刻关闭防火墙。

2. 在 VS Code 打开正确的终端

打开 Terminal → New Terminal,在右侧加号旁的下拉菜单选择 PowerShell。图中同时列出 Git Bash、Command Prompt 和 WSL;本文命令需要 Windows PowerShell,而不是 WSL 的 Linux shell。

图源:Microsoft / VS Code 官方文档,© Microsoft Corporation,文档按 CC BY 3.0 US 提供,见 仓库许可。原图未修改,框线来自原图。

注意:VS Code 的 Ports 面板用于端口转发等功能,不是 Windows 所有监听端口的完整清单。应以系统查询和实际应用状态为依据。

3. 查询监听,再检查拥有它的进程

下面以 8080 为排查示例,替换成报错中的实际端口:

$connections=Get-NetTCPConnection-LocalPort 8080-State Listen-ErrorAction SilentlyContinue$connections|Select-ObjectLocalAddress,LocalPort,State,OwningProcess

拿到 PID 后核对进程身份。以下命令仅在确实查询到连接时执行:

if($connections){$connections.OwningProcess|Sort-Object-Unique|ForEach-Object{Get-Process-Id$_|Select-ObjectId,ProcessName,Path}}

OwningProcess是进程 ID,不是端口号。进程退出后 PID 可能被复用,操作前重新核对身份;Path 字段可能因权限不可见,不应据此猜测来源。Get-NetTCPConnection 官方文档

如果命令无输出,确认端口号和协议,检查程序是否已经退出,以及绑定的是 Windows 还是 WSL/容器环境。不要把无输出当成“系统保证端口完全可用”。

4. 确认冲突后,按场景处理

场景优先操作验证
自己重复启动的开发服务回原终端 Ctrl+C 正常退出再查监听并重启服务
正在使用的其他服务保留服务,修改新应用端口客户端和代理同步新端口
托管进程自动重启查对应服务或任务管理入口通过正式停止方式处理
无监听仍绑定失败核对完整错误、地址与环境不按“杀进程”路线盲目处理

端口改动后要同时检查回调 URL、代理、测试脚本等调用方。服务启动成功但客户端仍访问旧端口,会制造第二个问题。

5. 最小复现:占用一个动态端口,再释放

以下代码只绑定回环地址,不访问外网,不结束任何已有进程。系统分配端口,不假设某个固定端口空闲。Windows 使用排他绑定,保证实验中的第二次绑定不会共享监听地址。

importosimportsocket holder=socket.socket()probe=socket.socket()try:ifos.name=="nt":holder.setsockopt(socket.SOL_SOCKET,socket.SO_EXCLUSIVEADDRUSE,1)holder.bind(("127.0.0.1",0))holder.listen(1)port=holder.getsockname()[1]print("占用端口:",port)try:probe.bind(("127.0.0.1",port))exceptOSErrorasexc:print("第二次绑定失败:",getattr(exc,"winerror",exc.errno))else:raiseRuntimeError("没有复现绑定冲突")finally:probe.close()holder.close()withsocket.socket()ascheck:check.bind(("127.0.0.1",port))print("释放后绑定成功")

本次 Windows / Python 3.12.10 实验端口是 29539:重复绑定返回 WinError 10048;监听期间 Get-NetTCPConnection 查到 127.0.0.1 和实验进程 PID;关闭监听 socket 后重新绑定成功。端口与 PID 每次都可能不同,不能照抄数值去操作自己的系统。

Python socket 行为参考 官方文档。本实验没有建立 TCP 会话,因此没有验证 TIME_WAIT;实际网络服务关闭后的状态可能不同。SO_REUSEADDR 的平台行为也不同,不能拿它覆盖仍然运行的监听者。

6. 最后确认应用真的恢复

再次检查监听地址和拥有进程,启动原应用并执行一次实际请求。监听成功只是第一步,仍需确认访问路径、协议和响应符合预期。截图中选择 PowerShell 是操作入口示例,真正的占用证据来自系统查询与实验记录。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询