我正在尝试通过USB在台式计算机和许多移动设备之间创建服务器-客户端连接。
对我来说,在桌面端创建一个套接字服务器来侦听特定的端口进行连接是有意义的,同时让多个移动设备连接到此端口。但是,我在usbmuxd上找到的信息说移动设备应该是套接字服务器:
In practice it is possible to **create a socket server in a free port from an iOS** App and to connect to it from the host machine sending the following command via the /var/run/usbmuxd Unix socket (File Descriptor):
<?xml version=”1 .0" encoding=”UTF-8"?>
<!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList1.0.dtd”>
<plist version=”1.0">
<dict>
<key>ClientVersionString</key>
<string>usbmuxd-423.206.4</string>
<key>DeviceID</key>
<integer>4</integer>
<key>MessageType</key>
<string>Connect</string>
<key>PortNumber</key>
<integer>My port</integer> <--- The port number (with endian transform htonl)
<key>ProgName</key>
<string>usbmuxd</string>
</dict>
</plist>
对于Android,似乎adb forward tcp:<port1> tcp:<port2>
通过转发桌面主机端口来做类似的事情,但主机本质上是一个套接字客户端。据我了解,主机必须知道任意设备上的所有端口,并且设备必须确保这些端口是唯一的,这使得很难使用多个设备自动执行握手过程。
这是设计使然吗?以这种方式反转桌面和移动设备之间的服务器-客户端关系是不可能的吗?
还是我对整件事的看法是错误的?
adb forward
和usbmuxd
(通常通过iproxy
(都将PC上的TCP端口转发到移动设备。这意味着您的PC是客户端,而您的移动设备充当TCP服务器。
通常,您在移动设备上启动一个众所周知的应用程序,该应用程序总是公开相同的端口(例如,2000(。您可以通过执行adb forward tcp:3000 tcp:2000
或iproxy 3000 2000
连接到设备上运行的应用程序。然后,可以通过连接到电脑上的端口 3000 连接到设备上的端口 2000。
如果你有多个设备,则可以在电脑上使用不同的端口,并将它们转发到设备上的同一端口。例如,您可以使用adb forward -s device_1 tcp:3001 tcp:2000
和adb forward -s tdevice_2 tcp:3002 tcp:2000
。连接到电脑上的端口 3001 最终会连接到设备1上的端口 2000,电脑上的端口 3002 将映射到设备 2 上的端口 2000。