端口被占用怎么办?客户端提示端口冲突的处理

先说结论

端口被占用是指客户端想监听的本机端口已被另一个程序占着。解决分三步:查出占用者,决定结束它还是给客户端换一个端口,最后把浏览器、终端、其他软件里写死的旧端口一并改成新的。

你遇到的现象

客户端提示端口已被占用,或者改端口后其他软件连不上。

客户端一启动就弹出“端口已被占用”,或者内核干脆闪退;也可能是你好心把端口改了,结果浏览器反而连不上。无论是哪一种,端口被占用都是同一个根子:本机上的端口一次只能有一个程序在监听,谁先占上,谁说了算。

为什么客户端需要占用端口

代理客户端在你的电脑上开一个“本地入口”,浏览器和其他软件把请求交给这个入口,再由客户端转发出去。入口就是本机地址加端口号。Clash 系客户端常见的混合端口是 7890,但这只是惯例而非规定,不同客户端、不同版本的默认值会不同,要看你的设置页。

所以“代理端口冲突”的实质就是:客户端想占的那个入口,已经有别的程序占着了。词典里关于相关概念的解释,可以看 词典。

端口被占用时,先看报错里是哪一个端口

不同客户端提示的方式不同,但都要先弄清三件事:

要弄清的 怎么看 用途
哪个端口冲突 看提示或日志里的数字 决定去查谁在占用
是启动时冲突还是运行中冲突 看出现时机 启动时多半是残留进程
是否刚改过设置 回忆最近的操作 改过端口要同步引用处

客户端内核起不来的更完整情形,见 Clash Verge 无法启动或内核报错怎么办。

查出谁占用了端口

下面以端口 7890 为例,换成你的实际端口即可。

Windows

  1. 以管理员身份打开命令提示符或终端。
  2. 运行 netstat -ano | findstr :7890,记下最右一列的进程编号。
  3. 运行 tasklist | findstr 进程编号,看到进程名称。

macOS 或 Linux

  1. 打开终端,运行 lsof -i :7890,输出里有进程名称和编号。
  2. Linux 上也可以用 ss -ltnp | grep 7890,输出格式随版本略有差异。

查到进程名后,先判断它是什么:

  • 另一个代理客户端,或旧版本残留的进程:直接退出它。
  • 明显是你需要的程序(例如某个开发服务):给客户端换端口,不要结束它。
  • 看不懂的系统进程:不要随意结束,换端口更稳妥。

端口明明没人用,却仍提示被占用

在 Windows 上,系统可能预留了一段端口范围,普通程序无法使用,这时查不到任何占用者。可以用下面的命令查看已保留的范围:

netsh interface ipv4 show excludedportrange protocol=tcp

如果你的端口落在某一段里,7890端口占用的提示就是由此而来,最简单的办法是给客户端换一个范围之外的端口。

常见的几类占用者

查到进程名之后,对照下面几类情形,能更快判断该怎么处理:

占用者 常见来源 建议
另一个代理客户端 装了不止一款,或旧软件开机自启 只保留一个,关掉自启
上次未退出的内核进程 客户端崩溃或被强行关闭后残留 结束残留进程,再重启客户端
开发或调试服务 本机正在运行的网站、数据库等 给客户端换端口,不动对方
看不懂的系统进程 系统服务或安全软件 不要强行结束,换端口

第二种情形尤其常见:客户端被强行关闭后,内核进程还在后台挂着,下次启动自然就提示端口被占用。在任务管理器或活动监视器里找到它,结束即可。

在客户端里改端口

改端口的位置因客户端而异,通常在设置里的网络、端口或核心设置一栏,以当前界面为准。改的时候遵循几条原则:

  1. 选一个较大的、不常用的数字,避开常见服务的默认端口。
  2. 一次只改一处,改完保存并重启内核。
  3. 如果同时有“混合端口”“HTTP 端口”“SOCKS 端口”几项,确认各项互不相同。
  4. 改完先让客户端自己的系统代理更新,再去处理手动填写的地方。

改完端口,哪些地方必须同步

这一步是大多数“改了端口反而连不上”的原因。检查下面这些位置:

位置 为什么要改
系统代理设置 客户端通常会自动更新,但要确认
浏览器代理扩展 里面常写死了旧端口
终端的环境变量 写在配置文件里的 HTTP_PROXY 等不会自动更新
其他软件里单独填的代理 如聊天软件、下载器的网络设置
脚本或开发工具的代理项 例如包管理器、版本控制工具的配置

系统代理本身的排查,见 系统代理不生效怎么办。

想一劳永逸:减少下次冲突的几个习惯

  • 一台电脑上只保留一款常用的代理客户端,其余的卸载或关掉开机自启。
  • 退出客户端时选择正常退出,不要直接结束进程,让内核有机会释放端口。
  • 改过端口之后,把新端口和需要同步的位置记在一份简单的笔记里,下次换设备时对着清单改。
  • 开发环境里经常开本地服务的人,可以固定给代理客户端留一段不与开发服务重叠的端口。

这些习惯花不了多少时间,却能让“端口冲突”这类问题基本不再出现。

怎么确认冲突真的解决了

  1. 重新启动客户端,确认内核正常运行,没有端口相关的报错。
  2. 再运行一次上面的查询命令,应该看到占用者变成了客户端自己。
  3. 用浏览器访问 IP 与 DNS 检测导航 里的检测页,看出口信息是否变化。
  4. 重启电脑后再试一次,确认不会又被开机自启的程序抢走。

下一步怎么做

端口被占用大多不难处理,关键是别只改一处:查出占用者,决定关掉它还是换端口,再把所有引用旧端口的位置一次改齐。如果换了端口、改齐了引用,网页仍然不通,问题就不在端口了,回到 梯子连不上怎么办 按现象重新分层排查。

这篇没有覆盖的

  • 命令的输出格式随系统版本略有差异,本文只给查找思路,不替你判断某个进程能否安全结束。
  • 默认端口号因客户端和版本而异,7890 只是 Clash 系常见的例子,请以你的客户端设置页为准。
  • 本文只处理本机端口冲突,节点服务器端的端口问题需要由服务方处理。

端口被占用常见问题

端口被占用是什么意思?

本机每个端口同一时间只能被一个程序监听。代理客户端启动时要监听本机的一个或几个端口,用来接收浏览器等软件发来的请求。如果这个端口已经被别的程序占着,客户端就无法监听,只能报错或自动退出,这就是端口被占用。

7890 端口被占用,是不是只能结束占用它的程序?

不一定。结束占用者和给客户端换端口都能解决,哪种更合适取决于占用者是什么。如果占用者是另一个代理软件或残留的旧进程,关掉它即可;如果是你需要的程序,就在客户端里改成别的端口,并同步改所有引用旧端口的地方。

客户端里改了端口,为什么浏览器反而不能上网了?

因为浏览器扩展、系统代理、终端环境变量里可能仍然写着旧端口。客户端自动写入的系统代理会更新,但手动填写的地方不会跟着变。把所有写死旧端口的位置逐一改成新端口,就能恢复。

重启电脑能解决端口占用吗?

如果占用者是残留进程或未正常退出的软件,重启通常能释放端口。但若占用者是开机自启的程序,重启后它又会先占住,问题依旧。这时要找到它并关闭自启,或者给客户端换端口,而不是反复重启。

Windows 上端口明明没人用,仍提示被占用,为什么?

系统有时会预留一段端口范围,用户程序无法使用,这种情况下查不到占用进程。可以用系统自带的命令查看已保留的端口范围,如果落在其中,直接给客户端换一个范围之外的端口即可。

接着读

文中出现的术语

接下来去哪儿?

找官方入口去网址导航,想核对仓库和版本看GitHub 项目导航;需要现成的机场,机场目录收了 28 家的价格与线路资料,性价比机场、便宜机场、VPN 机场分别有专项页。