在我的设置中,我有 2 个应用程序。一个在我的 MacBook 上的本地模拟器上运行。另一个在我的 Android 实体手机上。
在这些应用程序中,我使用 ZeroMQ 来拥有 Req/Rep 套接字,该套接字在幕后使用 TCP。
当使用端口 6543 在模拟设备上托管我的服务器时,其 IP 位于 wlan0,我无法从手机连接到它。在手机托管服务器并且模拟器连接到它的情况下,反转角色效果很好,但从长远来看,我需要模拟器来运行该服务器。最终 iOS 开发者想要与 Android 服务器对话,所以我更愿意让他们使用模拟器来实现这一点。
我的理解是android模拟器存在于虚拟路由器后面,所以如果你想与它们交谈,你必须使用端口转发。
我已经为我的模拟器完成了此操作。使用
redir add tcp:7654:6543
。如果我理解正确,那么我的 Macbook 的端口 7654 应该将其流量重定向到我的模拟器的端口 6543。
我相信我应该使用 Macbook 的 IP,而不是直接连接到模拟器上的
wlan0
的 IP。为此,我运行 ifconfig | grep "inet "
并连接到返回此处的 IP 地址。
尝试在我的应用程序中接收数据包,但我仍然看不到流量。
另外我在Macbook的wifi接口上安装了Wireshark和
tcp.port == 7654
过滤器。虽然我确实看到了一些消息,但我不确定我看到的是我的消息本身,还是只是 TCP 握手,因为我看到多个 SYN
和 [RST, ACK]
但不清楚我是否真的应该能够看到我要发送的有效负载?
我现在不知道该怎么办。我怎样才能真正验证我的 MacBook 的流量是否正常?如何验证转发设置是否正确?
事实证明有很多步骤可以解决这个问题。
首先我们必须按照官方android文档中提到的那样进行端口转发,这样我们就可以将消息发送到模拟器:
在终端运行
adb devices
以获取设备的端口
List of devices attached
emulator-5554 device
然后您需要使用设备所在的端口运行
telnet localhost 5554
。
从这里系统将提示您输入身份验证密钥:
* Android Console: Authentication required
* Android Console: type 'auth <auth_token>' to authenticate
* Android Console: you can find your <auth_token> in
* '/Users/<your_username>/.emulator_console_auth_token'
按照提示操作,打开第二个终端并查看文件以获取您的令牌。
回到您需要执行的第一个终端
auth <your_token>
然后您可以设置端口转发
redir add tcp:8765:7654
这将从 Macbook 的环回端口“8765”重定向到 Android 模拟器端口“7654”。
现在您必须从 Macbook 公共 IP 重定向到其内部环回地址。
首先转到
System Preference -> Sharing -> enable Remote Login
,以便我们可以使用 SSH 设置端口转发。
虽然 SSH 需要身份验证,并且打开后我猜测当您向外部流量开放笔记本电脑时可能会存在一些安全问题。在继续之前,这可能是您需要进行更多研究的地方。
如果没问题,您可以运行
ssh -v -g -L 9876:localhost:8765 localhost
,然后它将在终端中运行并为您执行转发。
最终结果是:
macbook_ip:9876
转发至 macbook_loopback_ip:8765
转发至 android_emulator:7654
在模拟器端,您必须绑定到操作系统自动分配的地址之一:
10.0.0.2:7654
ifconfig | grep "inet "
10.0.0.253:9876