我试图将UDP数据包从模拟设备(Nexus S 4.0",480 x 800:hdpi)发送到我的主机PC进行开发和测试。发送方似乎是正确的,并没有遇到任何错误,但Wireshark表示他们没有到达主机PC。我已经研究过这个问题,所有对他人有用的修复都不适合我:
我添加了" uses-permission android:name =" android.permission.INTERNET"到maifest XML文件。 (我也有ACCESS_NETWORK_STATE,但我认为这不是必要的。)
我将数据包发送到主机环回地址10.0.2.2。端口是5006,所以我不需要特殊权限。
我在专用线程中调用DatagramSocket.send(),而不是在主线程中调用。 (我认为无论如何都会抛出NetworkOnMainThreadException,而且我没有任何例外。)
我已经Telnet-ed into" localhost 5444"并发布了" redir add udp:5006:5006"命令在仿真器的虚拟路由器上设置UDP端口转发。该命令返回" OK"没有错误," redir list"返回" udp:5006 => 5006"
我还在我的主机PC的路由器上设置了UDP端口转发(端口5006)(在PC和开放式互联网之间)。但我不认为这应该是必要的,这个路由器不在模拟器和主机PC之间。
我在主机PC上禁用了Windows防火墙和防病毒软件。
以下是我的MainActivity.java中的相关代码。从按钮单击调用start()和stop()方法(省略因为它们不是问题的一部分):
private static String TAG = "MainActivity";
private volatile boolean running = false;
private String ip = "10.0.2.2";
private int port = 5006;
public void start(View view) {
new Thread() {
public void run() {
byte[] bytes = "Hi from UDPSender!".getBytes();
try {
InetAddress inetAddr = InetAddress.getByName(ip);
running = true;
while (running == true) {
DatagramPacket packet = new DatagramPacket(bytes, bytes.length, inetAddr, port);
DatagramSocket socket = new DatagramSocket();
socket.setBroadcast(false);
socket.send(packet);
socket.close();
Log.d(TAG, "Send packet to "+packet.getAddress().getHostAddress()+":"+packet.getPort());
Thread.sleep(1000);
}
} catch (Exception e) {
Log.e(TAG, e.getMessage(), e);
}
}
}.start();
}
public void stop(View view) {
running = false;
}