端口被占用怎么办?客户端提示端口冲突的处理
端口被占用是指客户端想监听的本机端口已被另一个程序占着。解决分三步:查出占用者,决定结束它还是给客户端换一个端口,最后把浏览器、终端、其他软件里写死的旧端口一并改成新的。
你遇到的现象
客户端提示端口已被占用,或者改端口后其他软件连不上。
客户端一启动就弹出“端口已被占用”,或者内核干脆闪退;也可能是你好心把端口改了,结果浏览器反而连不上。无论是哪一种,端口被占用都是同一个根子:本机上的端口一次只能有一个程序在监听,谁先占上,谁说了算。
为什么客户端需要占用端口
代理客户端在你的电脑上开一个“本地入口”,浏览器和其他软件把请求交给这个入口,再由客户端转发出去。入口就是本机地址加端口号。Clash 系客户端常见的混合端口是 7890,但这只是惯例而非规定,不同客户端、不同版本的默认值会不同,要看你的设置页。
所以“代理端口冲突”的实质就是:客户端想占的那个入口,已经有别的程序占着了。词典里关于相关概念的解释,可以看 词典。
端口被占用时,先看报错里是哪一个端口
不同客户端提示的方式不同,但都要先弄清三件事:
| 要弄清的 | 怎么看 | 用途 |
|---|---|---|
| 哪个端口冲突 | 看提示或日志里的数字 | 决定去查谁在占用 |
| 是启动时冲突还是运行中冲突 | 看出现时机 | 启动时多半是残留进程 |
| 是否刚改过设置 | 回忆最近的操作 | 改过端口要同步引用处 |
客户端内核起不来的更完整情形,见 Clash Verge 无法启动或内核报错怎么办。
查出谁占用了端口
下面以端口 7890 为例,换成你的实际端口即可。
Windows
- 以管理员身份打开命令提示符或终端。
- 运行
netstat -ano | findstr :7890,记下最右一列的进程编号。 - 运行
tasklist | findstr 进程编号,看到进程名称。
macOS 或 Linux
- 打开终端,运行
lsof -i :7890,输出里有进程名称和编号。 - Linux 上也可以用
ss -ltnp | grep 7890,输出格式随版本略有差异。
查到进程名后,先判断它是什么:
- 另一个代理客户端,或旧版本残留的进程:直接退出它。
- 明显是你需要的程序(例如某个开发服务):给客户端换端口,不要结束它。
- 看不懂的系统进程:不要随意结束,换端口更稳妥。
端口明明没人用,却仍提示被占用
在 Windows 上,系统可能预留了一段端口范围,普通程序无法使用,这时查不到任何占用者。可以用下面的命令查看已保留的范围:
netsh interface ipv4 show excludedportrange protocol=tcp
如果你的端口落在某一段里,7890端口占用的提示就是由此而来,最简单的办法是给客户端换一个范围之外的端口。
常见的几类占用者
查到进程名之后,对照下面几类情形,能更快判断该怎么处理:
| 占用者 | 常见来源 | 建议 |
|---|---|---|
| 另一个代理客户端 | 装了不止一款,或旧软件开机自启 | 只保留一个,关掉自启 |
| 上次未退出的内核进程 | 客户端崩溃或被强行关闭后残留 | 结束残留进程,再重启客户端 |
| 开发或调试服务 | 本机正在运行的网站、数据库等 | 给客户端换端口,不动对方 |
| 看不懂的系统进程 | 系统服务或安全软件 | 不要强行结束,换端口 |
第二种情形尤其常见:客户端被强行关闭后,内核进程还在后台挂着,下次启动自然就提示端口被占用。在任务管理器或活动监视器里找到它,结束即可。
在客户端里改端口
改端口的位置因客户端而异,通常在设置里的网络、端口或核心设置一栏,以当前界面为准。改的时候遵循几条原则:
- 选一个较大的、不常用的数字,避开常见服务的默认端口。
- 一次只改一处,改完保存并重启内核。
- 如果同时有“混合端口”“HTTP 端口”“SOCKS 端口”几项,确认各项互不相同。
- 改完先让客户端自己的系统代理更新,再去处理手动填写的地方。
改完端口,哪些地方必须同步
这一步是大多数“改了端口反而连不上”的原因。检查下面这些位置:
| 位置 | 为什么要改 |
|---|---|
| 系统代理设置 | 客户端通常会自动更新,但要确认 |
| 浏览器代理扩展 | 里面常写死了旧端口 |
| 终端的环境变量 | 写在配置文件里的 HTTP_PROXY 等不会自动更新 |
| 其他软件里单独填的代理 | 如聊天软件、下载器的网络设置 |
| 脚本或开发工具的代理项 | 例如包管理器、版本控制工具的配置 |
系统代理本身的排查,见 系统代理不生效怎么办。
想一劳永逸:减少下次冲突的几个习惯
- 一台电脑上只保留一款常用的代理客户端,其余的卸载或关掉开机自启。
- 退出客户端时选择正常退出,不要直接结束进程,让内核有机会释放端口。
- 改过端口之后,把新端口和需要同步的位置记在一份简单的笔记里,下次换设备时对着清单改。
- 开发环境里经常开本地服务的人,可以固定给代理客户端留一段不与开发服务重叠的端口。
这些习惯花不了多少时间,却能让“端口冲突”这类问题基本不再出现。
怎么确认冲突真的解决了
- 重新启动客户端,确认内核正常运行,没有端口相关的报错。
- 再运行一次上面的查询命令,应该看到占用者变成了客户端自己。
- 用浏览器访问 IP 与 DNS 检测导航 里的检测页,看出口信息是否变化。
- 重启电脑后再试一次,确认不会又被开机自启的程序抢走。
下一步怎么做
端口被占用大多不难处理,关键是别只改一处:查出占用者,决定关掉它还是换端口,再把所有引用旧端口的位置一次改齐。如果换了端口、改齐了引用,网页仍然不通,问题就不在端口了,回到 梯子连不上怎么办 按现象重新分层排查。
这篇没有覆盖的
- 命令的输出格式随系统版本略有差异,本文只给查找思路,不替你判断某个进程能否安全结束。
- 默认端口号因客户端和版本而异,7890 只是 Clash 系常见的例子,请以你的客户端设置页为准。
- 本文只处理本机端口冲突,节点服务器端的端口问题需要由服务方处理。
端口被占用常见问题
端口被占用是什么意思?
本机每个端口同一时间只能被一个程序监听。代理客户端启动时要监听本机的一个或几个端口,用来接收浏览器等软件发来的请求。如果这个端口已经被别的程序占着,客户端就无法监听,只能报错或自动退出,这就是端口被占用。
7890 端口被占用,是不是只能结束占用它的程序?
不一定。结束占用者和给客户端换端口都能解决,哪种更合适取决于占用者是什么。如果占用者是另一个代理软件或残留的旧进程,关掉它即可;如果是你需要的程序,就在客户端里改成别的端口,并同步改所有引用旧端口的地方。
客户端里改了端口,为什么浏览器反而不能上网了?
因为浏览器扩展、系统代理、终端环境变量里可能仍然写着旧端口。客户端自动写入的系统代理会更新,但手动填写的地方不会跟着变。把所有写死旧端口的位置逐一改成新端口,就能恢复。
重启电脑能解决端口占用吗?
如果占用者是残留进程或未正常退出的软件,重启通常能释放端口。但若占用者是开机自启的程序,重启后它又会先占住,问题依旧。这时要找到它并关闭自启,或者给客户端换端口,而不是反复重启。
Windows 上端口明明没人用,仍提示被占用,为什么?
系统有时会预留一段端口范围,用户程序无法使用,这种情况下查不到占用进程。可以用系统自带的命令查看已保留的端口范围,如果落在其中,直接给客户端换一个范围之外的端口即可。
接着读
- 排查 · Clash Verge 无法启动或内核报错怎么办?
- 排查 · 系统代理不生效怎么办?程序不走代理的排查
- 排查 · 梯子连不上怎么办?按现象分步排查
- 排查 · TUN 模式开启失败怎么办?权限与冲突排查
- 排查 · v2rayN 连不上怎么办?节点、内核与路由设置自查
- 排查 · 节点超时怎么办?所有节点都超时的排查顺序