应用场景:同一个网络内的两台Mac,其中一台(客户端)用于应用开发和工程编译,另外一台(服务端)作为一个虚机服务器,启动和管理虚机镜像。
Android 调试桥 (adb)
- Android 调试桥 (adb)
adb通讯原理如下图所示:
服务器会与所有正在运行的设备建立连接。它通过扫描 5555 到 5585 之间(该范围供前 16 个模拟器使用)的奇数号端口查找模拟器。服务器一旦发现 adb 守护程序 (adbd),便会与相应的端口建立连接。
每个模拟器都使用一对按顺序排列的端口:一个用于控制台连接的偶数号端口,另一个用于 adb 连接的奇数号端口。例如:
模拟器 1,控制台:5554
模拟器 1,adb:5555
模拟器 2,控制台:5556
模拟器 2,adb:5557
依此类推。
如上所示,在端口 5555 处与 adb 连接的模拟器与控制台监听端口为 5554 的模拟器是同一个。
如果在本地启动了虚拟机,通过lsof -iTCP -sTCP:LISTEN -P | grep 'emulator|qemu'命令可以看到虚拟机进程监听本地的5554/5555端口。
emulator6 94105 macuser 20u IPv4 0xa8dacfb1d4a1b51f 0t0 TCP localhost:5555 (LISTEN)
emulator6 94105 macuser 21u IPv4 0xa8dacfb1d845a51f 0t0 TCP localhost:5554 (LISTEN)
注:理解adb的原理后就可以通过将localhost:5555的数据转发出来,从而别的设备可以通过adb connect的方式和服务器端的虚拟机通信了。
- lsof -i -P -n | grep LISTEN | grep <进程名或PID> 在Mac上查看端口情况
在 lsof 命令的输出中,-> 符号表示连接方向。它用于指示网络连接的方向,即数据流的流向。具体来说,LOCAL_ADDRESS -> REMOTE_ADDRESS 的形式表示本地地址到远程地址的连接方向。
例如,如果你看到类似以下的输出:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1234 user 3u IPv4 123456 0t0 TCP 127.0.0.1:22->192.168.1.2:54321 (LISTEN)
这表示 sshd 进程正在监听本地地址 127.0.0.1 的端口 22,并且有一个远程地址 192.168.1.2 的连接到这个端口。连接方向是从本地到远程,因为箭头是从左到右的。
- 端口转发概念:端口转发是一种网络技术,它允许将网络流量从一个端口或地址转发到另一个端口或地址。这个过程可以在网络设备或计算机上配置,以实现不同网络服务之间的通信或将流量从私有网络转发到公共网络,反之亦然。
在 macOS 上,可以使用 pfctl 命令实现端口转发。
连接方法一
服务端使用pfctl将TCP数据包从共享网络接口上的5555端口(或您喜欢的任何其他端口)重定向到环回接口上的奇数端口(本例中为127.0.0.1:5555)
- 创建 pf 配置文件:touch pf.conf
- 添加端口转发规则(共享网络接口的5555端口重定向到本地127.0.0.1:5555端口,也就是和虚机通讯的端口):
rdr pass on en0 inet proto tcp from any to any port 5555 -> 127.0.0.1 port 5555
- 加载配置:sudo pfctl -f pf.conf
- 启用 PF 防火墙以应用配置:sudo pfctl -e
最后在客户端通过adb connect host_ip:5555 连接远程虚机即可。
连接方法二
使用ssh建立本地端口转发
- 确保两端都开启了ssh服务并连通。
- 客户端通过ssh建立本地端口转发,下面的例子表示将远端设备环回路径127.0.0.1:5555的数据通过ssh通道转发到本地的15555端口。
ssh -L localhost:15555:127.0.0.1:5555 user@ip
- 通过adb connect localhost:15555连接虚机。