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