从Android模拟器发送UDP到主机PC

时间:2014-05-08 18:04:23

标签: android udp emulation

我试图将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;        
}

0 个答案:

没有答案