【问题标题】:udp forwarding to emulatorudp转发到模拟器
【发布时间】:2021-12-19 04:23:03
【问题描述】:

我的主机上有一个 java 应用程序,它将 UDP 数据包发送到一个端口:例如8888.
我有一个 Android 应用程序,它监听这个端口并简单地显示数据。

这适用于真实设备(通过 WiFi 连接到同一网络),但我无法在模拟器中使用它。

一些信息:

  • 我正在开发 Ubuntu 16.10
  • 我已停用 Ubuntu 防火墙
  • 通过 IntelliJ 启动 Android 模拟器应用程序
    • 模拟器的 API 级别为 25
  • 我使用 udp 端口​​转发,如 Android 文档中所述:
    telnet localhost 5554 redir add udp:8888:8888

Android 应用中连接端口的代码:

final DatagramSocket udpSocket = new DatagramSocket(8888);

这是发送广播的服务器的(伪)代码:

String data = "test";
InetAddress broadcastAddress = Inet4Address.getByName("255.255.255.255");
DatagramSocket udpSocket = new DatagramSocket();
udpSocket.setBroadcast(true);
byte[] dataBytes = data.getBytes();
DatagramPacket datagramPacket = new DatagramPacket(dataBytes, dataBytes.length, broadcastAddress, 8888);
udpSocket.send(datagramPacket);

我错过了什么?

【问题讨论】:

  • 为什么使用 5554?
  • 问题中的 Android 文档链接中对此进行了说明。

标签: android udp android-networking


【解决方案1】:

由于 Android 中的错误,这不起作用:Issue#207602: Emulator does not redirect UDP packets

解决方法:

  • 在终端中:
    • 获取您的 avds 列表:
      emulator -list-avds
    • 使用其中一个 avd 启动模拟器并添加 -engine classic 参数:
      emulator -avd Nexus_6_API_25_GER -engine classic
  • 然后在 Android Studio 中启动您的应用:
    Run - Run 'app' 并连接到您刚刚启动的模拟器
  • 在终端(可能是另一个终端)中设置 udp 端口​​重定向:
    telnet localhost 5554 redir add udp:8888:8888
  • 注意:在使用 -engine classic 时,我在较新的模拟器中发现了一些问题(像素启动器崩溃),但我的应用程序工作正常,它从主机接收了 UDP 数据包

【讨论】:

    【解决方案2】:

    正如 TmTron 所说,这个问题是由于一个错误,但您还需要将 UDP 数据包从您的本地 IP 地址(192.168.1.X)重新发送到您的本地主机(127.0.0.1),否则模拟设备将无法接收数据包。 为此,您可以创建一个简单的 UDP rediriger 或使用我创建的程序来做同样的事情https://github.com/danidis91/Port-forward-UDP

    【讨论】:

      猜你喜欢
      • 2011-12-30
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 2017-12-19
      • 1970-01-01
      • 2021-05-01
      • 2013-04-18
      • 2015-05-19
      相关资源
      最近更新 更多