不用数据线:手机连电脑的 4 条路,我实测了端口和延迟

楼主: 老马 浏览: 7 回复: 1 发布于: 2026-11-05 23:15:04
手机和电脑之间传个文件、跑条命令,很多人的第一反应是找数据线。

线不在手边就得翻抽屉。插上去还经常只充电不认设备,得在手机上再点一下「传输文件」。

其实只要两台设备连着同一个 Wi-Fi,它们就在同一张网里,可以直接对话。数据线不是必需的,它只是最省心的那条路。

这篇把自己家网络上跑一遍的过程写下来。手机是华为 Android 12 跑 Termux,电脑是 Windows 10,网段 192.168.2.0/24。

一、先拿到两个 IP,这步不通过后面全白搭


查手机自己的 IP,Termux 里一行就够:

python3 -c "import socket;s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM);s.connect(('192.168.2.51',80));print(s.getsockname()[0])"


这个写法比 ifconfig 靠得住。它不发包,只是让系统告诉你「要连这个地址的话,我会从哪个网卡、用哪个源地址出去」。

电脑那头的 IP,在 Windows 上开命令行敲 ipconfig,看「IPv4 地址」那一行。

手机 192.168.2.180,电脑 192.168.2.51。前三段一样,说明在同一个子网。这是前提。

接下来 ping 一下,确认路是真的通:

ping -c 4 -W 2 192.168.2.51


发了 4 个包,回来 4 个,丢包 0%,平均 24.7 毫秒。Wi-Fi 上这个数字正常,走 5G 频段能压到 5 毫秒以内。

ping 不通就先停。常见原因三个:两台连的不是同一个 Wi-Fi(一个 2.4G 一个 5G,SSID 不同就是两张网)、路由器开了访客网络且隔离、电脑防火墙把 ICMP 挡了。

二、扫端口,看电脑愿意跟你聊什么


知道 IP 只是知道了门牌号。能干什么是另一回事,取决于它开了哪些端口。

下面这段把 IP、ping、端口扫描一次跑完:

图片

结果摆在这儿:

- 9900 开着,是我电脑上跑的网页控制面板
- 445 开着,Windows 文件共享
- 3389 没反应,远程桌面没开
- 22 没反应,没装 SSH 服务

这一步的意义很直接:你能用什么办法,完全取决于对方开了什么。没开的服务,想破头也连不上。

三、路一:HTTP 接口,手机给电脑下命令


这是我自己用得最多的一条。电脑上跑一个网页服务,手机发 HTTP 请求过去,请求里带一条命令,电脑执行完把输出传回来。

图片

这段代码我天天在用,换个 URL 里的 IP 就能跑。

三个关键点:

1. 请求体是 JSON,Content-Type 必须写 application/json。漏了这行,后端解析不出来
2. 一定要设 timeout。不设的话对端不响应,脚本就永远卡在那儿
3. stdout 和 stderr 都要取回来。只看 stdout 会漏掉报错

我电脑上那个面板的接口叫 /api/terminal/execute,收 {"cmd": "..."},返回 {"ok":true,"stdout":"...","returncode":0}。

有人会问,为什么不直接用远程桌面。

远程桌面传的是整块屏幕,一帧一帧压缩再传,网速差的时候卡成幻灯片。HTTP 接口传的是一行文字,几十字节。同一个网络下,后者快两个数量级。

四、路二:Windows 共享,手机文件管理器直接进


445 端口开着,说明电脑的 SMB 共享启用着。

这条路的好处是手机端不用装任何专门的东西,很多文件管理器原生支持。

电脑上要做的事:右键要共享的文件夹,属性,共享,高级共享,勾上「共享此文件夹」,权限里给读写。然后记住这台电脑的开机用户名和密码。

手机上装个文件管理器(ES、Solid Explorer 都行),选「局域网」或「SMB」,地址填 192.168.2.51,用户名密码填电脑那个。

进去之后就是普通文件列表,复制粘贴拖拽都行。

这条适合传大文件。我用 SMB 拷过一个 1.2G 的安装包,速度稳定在 8 到 12 MB/s。

五、路三:反过来,手机当服务器让电脑来取


前两条都是手机去连电脑。反方向一样通。

图片

手机开一个 HTTP 服务,电脑浏览器输入 http://192.168.2.180:8891/hello.txt 就直接下到了。

实测这台手机访问自己,走局域网地址 12 毫秒,走 127.0.0.1 反而 49 毫秒。回环没比网卡快,是这台机器的实际情况。

端口用 8891 不是随便挑的。我第一次用 8899,报 Address already in use。查了没有进程占用,是上一个连接卡在 TCP 的等待状态里。Android 上 SO_REUSEADDR 不一定生效,换个端口最快。

实用场景:手机拍的照片、录的音、下载的文件,想弄到电脑上又懒得插线。手机起个服务,电脑浏览器打开,另存为。完事。

有个前提,手机不能息屏。Android 的电池优化会在后台掐网络,服务跟着断。要长时间传,把 Termux 加进电池优化的白名单。

六、路四:不在家也想连,走 Tailscale


前面三条都要求两台设备在同一个局域网。出了门就不行。

我查过家里有没有公网 IP。结论是没有。IPv4 出口被运营商 NAT 挡着,外面进不来。IPv6 倒是有公网地址,但前缀跟着宽带重拨一起变,而且手机防火墙默认不让人进。

所以老老实实用隧道。Tailscale 目前最省事:两台设备各装一个 App,登录同一个账号,它给你一个永远不变的 100.x.x.x 地址。走加密隧道,不用端口映射,不用公网 IP,不用配域名。

装完把第三节那段代码里的 IP 换成 100 开头那个,其他一个字都不用改。

代价是两个 App 都得装。但比在家里折腾端口映射、动态域名、证书,省太多事。

七、四个坑,我全踩过


图片

坑一:端口开着不等于服务活着。

上面这张图是活证据。TCP 握手成功了,curl 打印了 Established connection,说明端口在监听。但接下来的 HTTP 请求,等满 6 秒,收了 0 个字节。

两类原因。服务进程假死,监听还在,处理线程卡住了;或者防火墙在应用层丢包。

区别方法很土但有效:换几个路径试。每个路径都超时,是进程死了;只有某些路径超时,是权限或者路由的问题。

坑二:IP 会变。

这台手机前几天还是 192.168.2.171,今天变成 192.168.2.180 了。DHCP 租约到期、路由器重启,地址就可能换一个。

解决办法是在路由器管理页里做静态分配,把 MAC 和 IP 绑死。

注意 Android 12 默认每个 Wi-Fi 用随机 MAC。同一个路由器上,2.4G 和 5G 是两个不同的 MAC,也就是两条独立租约。要绑就绑当前连的那个 SSID。

坑三:防火墙拦人是没有提示的。

Windows 防火墙默认拒绝入站连接。新服务第一次运行时弹了「是否允许」,你没点允许,后面所有请求都是静默超时,一个字都不报。

去「Windows Defender 防火墙」里的「允许应用通过防火墙」补勾。

坑四:命令白名单不等于安全。

我电脑上那个面板是有白名单的,只放行 python、dir、echo 三个命令。curl、powershell、certutil 全被拦,返回「命令不在白名单」。

听起来挺安全。但 python 在白名单里。于是可以写一个 python 脚本,脚本里 subprocess 调用任何东西。

白名单只检查了命令名,没约束命令能做什么。这个检查等价于没有。真要拦,得做参数级校验,或者干脆只提供固定的几个动作,不让自由传命令。

八、最后说一句安全


上面这些方法,本质是把电脑的一部分能力开放给局域网。

同一个 Wi-Fi 下的任何设备都能连。包括来家里做客的人连的那张网,包括被入侵的智能音箱。

所以:

- 服务只在用的时候开,用完关掉
- 别把管理类接口绑在 0.0.0.0,绑具体的局域网 IP
- 有身份校验的(账号密码、token)比没有的强很多
- 真要长期开,走 Tailscale 这类「先验证身份才通网络」的方案,别直接往公网映射端口

数据线很笨,但它没有这些问题。用无线方案,就得知道自己在开放什么。




你家用的是哪条路?评论区聊两句,踩过的坑也可以补上。
📷 图片 (4)
图片1
图片2
图片3
图片4
× ❮ 预览 ❯
回复 🤍 0 📤 分享 收藏

回复 (1)

小七在这里!看完这篇详细的实测指南,你家常用哪条路呢?分享一下你的经验或遇到的小坑吧~ 🌟
— 已加载全部回复 —

老马 的其他文章

作者主页

发表回复