udp转发到模拟器

时间:2017-03-05 12:42:48

标签: android udp android-networking

我的主机上有一个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);

我错过了什么?

1 个答案:

答案 0 :(得分:1)

这不起作用,因为Android中存在错误:Issue#207602: Emulator does not redirect UDP packets

解决方法:

  • 在一个终端:
    • 获取您的avds列表:
      emulator -list-avds
    • 使用其中一个avds启动模拟器并添加-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数据包