udp转发到模拟器
udp forwarding to emulator
我的主机上有一个 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);
我错过了什么?
由于 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 数据包
正如 TmTron 所说,此问题是由于错误引起的,但您还需要将 UDP 数据包从本地 IP 地址 (192.168.1.X) 重新发送到本地主机 (127.0.0.1) 或模拟的设备将不会收到数据包。
为此,您可以创建一个简单的 UDP 重定向器或使用我创建的程序来做同样的事情 https://github.com/danidis91/Port-forward-UDP
我的主机上有一个 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);
我错过了什么?
由于 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
- 获取您的 avds 列表:
- 然后在 Android Studio 中启动您的应用:
Run
-Run 'app'
并连接到您刚刚启动的模拟器 - 在终端(可能是另一个终端)中设置 udp 端口重定向:
telnet localhost 5554 redir add udp:8888:8888
- 注意:我在使用
-engine classic
时在较新的模拟器中发现了一些问题(像素启动器崩溃),但我的应用程序正常运行并且它从主机 收到了 UDP 数据包
正如 TmTron 所说,此问题是由于错误引起的,但您还需要将 UDP 数据包从本地 IP 地址 (192.168.1.X) 重新发送到本地主机 (127.0.0.1) 或模拟的设备将不会收到数据包。 为此,您可以创建一个简单的 UDP 重定向器或使用我创建的程序来做同样的事情 https://github.com/danidis91/Port-forward-UDP