在我的设置中,我有两个应用程序.一个运行在我的macbook本地模拟器上.另一个在我的物理Android手机上.

在这些应用程序中,我使用ZeroMQ来获得一个Req/Rep套接字,其背后使用的是TCP.

当使用端口6543在模拟设备上托管我的服务器时,它的IP为wlan0,我无法从我的手机连接到它. 在电话承载服务器和模拟器连接到它的地方,角色颠倒工作正常,但从长远来看,我需要模拟器来运行这个服务器.最终,iOS开发人员希望与Android服务器对话,所以我更希望他们使用模拟器来实现这一点.

我的理解是android emulators exist behind a virtual router,所以如果你想和他们说话,你必须使用端口转发.

我已经为我的模拟器做了这个.使用redir add tcp:7654:6543. 如果我理解正确,那么我的Macbook端口7654应该有它的流量重定向到我的模拟器端口6543.

而不是直接连接到我的模拟器上的IP wlan0,我认为我应该使用我的Macbook的IP.为此,我运行ifconfig | grep "inet "并连接到返回这里的IP地址.

try 在我的应用程序中接收数据包,但我仍然看不到流量.

此外,我在MacBook的WiFi接口上安装了Wireshark和过滤器tcp.port == 7654.虽然我确实看到了一些消息,但我不确定我看到的是我的消息本身,还是仅仅是TCP握手,因为我看到多个SYN[RST, ACK],但不清楚我是否应该真的能够看到我发送的有效载荷?

我不知道现在该怎么办.我如何才能真正验证流量是否到达我的MacBook OK?如何验证转发设置是否正确?

推荐答案

因此,解决这个问题有很多步骤.

首先,我们必须按照official android docs中提到的那样做端口转发,这样我们就可以将消息发送到仿真器:

在终端运行adb devices中获取设备的端口

List of devices attached
emulator-5554   device

然后,您需要使用设备所在的端口运行telnet localhost 5554.

在这里,您将被提示输入auth密钥:

 * 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"的UART端口重定向到Android模拟器端口"7654".

现在,您必须从您的Macbook公共IP重定向到其内部VLAN地址.

首先转到System Preference -> Sharing -> enable Remote Login,以便我们可以使用SSH设置端口转发.

虽然SSH需要身份验证,并且打开SSH,我猜当您打开笔记本电脑时,可能会有一些安全问题.这可能是在你继续之前进行更多研究的地方.

如果这是确定的,你可以然后运行ssh -v -g -L 9876:localhost:8765 localhost,然后运行在终端和执行转发为你.

最终结果是: 从macbook_ip:9876macbook_loopback_ip:8765android_emulator:7654

在Emulator端,您必须通过操作系统绑定到它的addresses automatically assigned个: 10.0.0.2:7654

在物理设备端,您连接到Macbook IP:端口.这个号码你需要自己跑ifconfig | grep "inet "

例如,您可以连接到如下内容: 10.0.0.253:9876

在这一点上,您应该让您的物理Android手机能够向您绑定在Emulator中的套接字发送消息,以及从该套接字接收消息.

Android相关问答推荐

三星上的某些应用程序已禁用通知权限切换

编写视觉转型

Android:MethodHandle. invoke和MethodHandle. invokeExact仅从Android O( - min—api 26)开始支持

在不增加父行宽度的情况下添加延迟行或可滚动行

Jetapck Compose:将Compose BOM更新为最新版本&2024.01.00&Quot;CircularProgressIndicator后出现错误

为什么Ionic-checkbox不总是刷新Android上的视图?

使用Kotlin/Compose与Java/XML指南的比较

使用 JNI 从 Android 应用程序中使用 Kotlin/Native 预构建共享库

Android 导航 - 定义参数

为什么 Android Studio 中的 theme.xml 目录没有任何原色

ArrayList 上的 Android intent.getParcelableArrayListExtra 引发 Nullpointer 异常

我怎样才能在多行 TextView 旁边有一个 ImageView 并且不超过父级的限制?

在 jetpack compose 中交替使用 View.INVISIBLE

根据 Jetpack Compose 中的生命周期正确处理变量/函数

我的 React Native 在 11 月 4 日之前运行良好,但现在在运行 yarn android 时抛出异常

如何在 Android Studio 中创建新的可组合函数?

房间实时数据:启动时崩溃

EAS 构建失败,错误代码为 1,但 Expo Build 成功,我需要 EAS 构建来删除未使用的包,如 com.segment.analytics.android:analytics

Android TTS 在屏幕关闭一段时间后停止朗读

在 compose 屏幕之间传递 uri 会导致:SecurityException: Permission Denial