Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法将UDP数据包从开发计算机发送到Android Emulator_Android_Android Emulator_Udp - Fatal编程技术网

无法将UDP数据包从开发计算机发送到Android Emulator

无法将UDP数据包从开发计算机发送到Android Emulator,android,android-emulator,udp,Android,Android Emulator,Udp,因为Android Emulator不支持如上所述的多播,所以我一直在尝试解决我的情况 为此,我编写了一个小型Java程序,用于侦听多播数据包,然后将其重复发送到本地主机地址。因为这个“多播转发器”与android仿真器运行在同一台机器上,所以我希望能够将多播数据包回送到仿真器中。不幸的是,这似乎不起作用 这是我在Eclipse和Emulator之外运行的“多播转发器”方法。我已检查它是否从网络其他位置的另一台机器接收UDP消息,该机器传输包含时间的UDP数据包: public static v

因为Android Emulator不支持如上所述的多播,所以我一直在尝试解决我的情况

为此,我编写了一个小型Java程序,用于侦听多播数据包,然后将其重复发送到本地主机地址。因为这个“多播转发器”与android仿真器运行在同一台机器上,所以我希望能够将多播数据包回送到仿真器中。不幸的是,这似乎不起作用

这是我在Eclipse和Emulator之外运行的“多播转发器”方法。我已检查它是否从网络其他位置的另一台机器接收UDP消息,该机器传输包含时间的UDP数据包:

public static void main(String[] args) throws IOException{
        boolean loop = true;
        MulticastSocket socket = new MulticastSocket(4446);
        InetAddress address = InetAddress.getByName("230.0.0.1");
    socket.joinGroup(address);
        DatagramSocket txSocket = new DatagramSocket();   // UDP socket to re transmit on
        DatagramPacket packet;
        while (loop){
        byte[] buf = new byte[256];
            packet = new DatagramPacket(buf, buf.length);
            socket.receive(packet);

            String received = new String(packet.getData(), 0, packet.getLength());
            System.out.println("Quote of the Moment: " + received);
            packet = new DatagramPacket(received.getBytes(), received.getBytes().length, InetAddress.getLocalHost, 4448);
            txSocket.send(packet);
    }

    socket.leaveGroup(address);
    socket.close();
    }
这是我在android应用程序中运行的“接收器”代码:

ConnectivityManager connMgr = (ConnectivityManager) 
                getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
            if (networkInfo != null && networkInfo.isConnected()) {
                txtView.append("Network connected.\r\n");
                WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE);
                WifiManager.MulticastLock wmmc = wm.createMulticastLock("MulticastTest");
                if (wmmc.isHeld()){
                    txtView.append("Multicast lock is held\r\n");
                }else{
                    txtView.append("Multicast lock NOT held, attempting to acquire.\r\n");
                    wmmc.acquire();
                }
                if (wmmc.isHeld()){
                    try{
                        DatagramSocket rxSocket = new DatagramSocket(4448);
                        rxSocket.setSoTimeout(5000);
                        DatagramPacket packet;

                            // get a few quotes
                        for (int i = 0; i < 5; i++) {

                            byte[] buf = new byte[256];
                                packet = new DatagramPacket(buf, buf.length);
                                try{
                                    rxSocket.receive(packet);
                                    String received = new String(packet.getData(), 0, packet.getLength());
                                    txtView.append(received + "\r\n");
                                } catch (InterruptedIOException ex){
                                    txtView.append("Socket timed out.\r\n");
                                }
                                //System.out.println("Quote of the Moment: " + received);
                        }

                        //socket.leaveGroup(address);
                        //socket.close();
                    }catch (Exception ex){
                        txtView.append(ex.toString() + "\r\n");
                    }finally{
                        wmmc.release();
                    }
                }else{
                    txtView.append("Could not acquire multicast lock.\r\n");
                }
            }else{
                txtView.append("Network NOT connected");
            }
ConnectivityManager connMgr=(ConnectivityManager)
getSystemService(Context.CONNECTIVITY\u服务);
NetworkInfo NetworkInfo=connMgr.getActiveNetworkInfo();
if(networkInfo!=null&&networkInfo.isConnected()){
附加(“网络已连接。\r\n”);
WifiManager wm=(WifiManager)getSystemService(Context.WIFI_服务);
WifiManager.MulticastLock wmmc=wm.createMulticastLock(“MulticastTest”);
if(wmmc.isHeld()){
append(“多播锁被持有\r\n”);
}否则{
append(“多播锁未保持,正在尝试获取。\r\n”);
wmmc.acquire();
}
if(wmmc.isHeld()){
试一试{
DatagramSocket rxSocket=新的DatagramSocket(4448);
rxSocket.setSoTimeout(5000);
数据包;
//获得一些报价
对于(int i=0;i<5;i++){
字节[]buf=新字节[256];
数据包=新数据包(基本单位,基本单位长度);
试一试{
rxSocket.receive(数据包);
接收到的字符串=新字符串(packet.getData(),0,packet.getLength());
txtView.append(已接收+“\r\n”);
}捕获(InterruptedIOException ex){
附加(“套接字超时。\r\n”);
}
//System.out.println(“当前报价:+已收到”);
}
//套接字组(地址);
//socket.close();
}捕获(例外情况除外){
append(例如toString()+“\r\n”);
}最后{
wmmc.release();
}
}否则{
txtView.append(“无法获取多播锁。\r\n”);
}
}否则{
追加(“网络未连接”);
}
不幸的是,接收套接字刚刚超时。我已尝试绑定到“10.0.2.2”(已描述),但这会引发一个异常,尽管这似乎仅在我想从Emulator访问开发机器,而我想从开发机器访问Emulator时才有用。
有人有什么建议吗?

进一步阅读Emulator,我想实现的似乎是这里描述的:解决方案与[这里][1][1]相同:它最终对您有效吗?我一直面临着同样的问题,它不与telnet重定向太工作。请你能就我的问题提出一些建议吗?我记得它是这么做的,但那是几年前在一个旧的Android仿真器上。你是说端口转发不再适用于当前模拟器吗?谢谢你的回复。端口转发确实有效。只是在尝试了包括telnet重定向在内的所有选项后,我无法看到正在接收的UDP数据包。谢天谢地,我能够切换到TCP,并且它使用了
adb反向TCP:50000 TCP:50000