每个Android模拟设备(后面简称AVD)都有自己独立的网络地址空间,它们之间是互相隔离的。
实际上AVD与当前调试的电脑所在的局域网也是隔离的,AVD可以通过当前调试PC转发,能访问局域网。
AVD的网络地址空间为10.0.2/24,其自身地址为10.0.2.15,PC的地址为10.0.2.2。
实际上,如果用adb shell(或者adb -s 设备名 shell)进入AVD的命令行模式,再使用getprop命令,可以看到
[net.eth0.gw]:10.0.2.2
也就是AVD使用PC作为网关,对目标地址为10.0.2/24地址空间以外的数据进行转发
但实际中有时会碰到比较头疼的事情。
比如运行AVD的PC机所在的局域网地址空间为192.168.0/24,自身的IP为192.168.0.23。现在想通过AVD给
192.168.0/24局域网发送UDP广播,像下面这样直接发肯定是不行的
为达到AVD发送广播到192.168.0/24地址空间的目的,需要另外运行一个程序专门用于数据转发。
首先在AVD里运行的Android程序,凡是需要广播的数据,都发送到PC机的IP上,即192.168.0.23,并规定一个
端口,比如11111.然后在PC机上单独写个程序,一接收到11111端口的数据,就转发到当前192.168.0/24
网段的广播地址。
关键部分代码如下
局域网发送给AVD的数据可以通过AVD的端口映射解决。比如一般模拟器的端口为5554,用telnet连接到模拟器
telnet localhost 5554
然后运行redir命令就能进行端口映射操作
这个命令有三个比较常用的子命令
redir add udp:13579:24680
//将本机13579端口映射到AVD的24680端口
即所有发送到本机13579端口的数据都将转发到24680端口上
redir del udp:13579
//移除映射关系
redir list
//列出映射关系
实际上AVD与当前调试的电脑所在的局域网也是隔离的,AVD可以通过当前调试PC转发,能访问局域网。
AVD的网络地址空间为10.0.2/24,其自身地址为10.0.2.15,PC的地址为10.0.2.2。
实际上,如果用adb shell(或者adb -s 设备名 shell)进入AVD的命令行模式,再使用getprop命令,可以看到
[net.eth0.gw]:10.0.2.2
也就是AVD使用PC作为网关,对目标地址为10.0.2/24地址空间以外的数据进行转发
但实际中有时会碰到比较头疼的事情。
比如运行AVD的PC机所在的局域网地址空间为192.168.0/24,自身的IP为192.168.0.23。现在想通过AVD给
192.168.0/24局域网发送UDP广播,像下面这样直接发肯定是不行的
String msg="Broadcast Message";
byte[] buffer=msg.getBytes();
InetAddress addr=InetAddress.getByName("255.255.255.255");
int port=12345;
DatagramPacket dp=new DatagramPacket(buffer,buffer.length,addr,port);
DatagramSocket ds=new DatagramSocket(port);
ds.send(dp);
这只会将广播发送到10.0.2/24地址空间里
为达到AVD发送广播到192.168.0/24地址空间的目的,需要另外运行一个程序专门用于数据转发。
首先在AVD里运行的Android程序,凡是需要广播的数据,都发送到PC机的IP上,即192.168.0.23,并规定一个
端口,比如11111.然后在PC机上单独写个程序,一接收到11111端口的数据,就转发到当前192.168.0/24
网段的广播地址。
关键部分代码如下
int port=11111;
DatagramSocket ds=new DatagramSocket(port);
DatagramPacket dp=new DatagramPacket(buffer,buffer.length);
int port_trans=12345;
InetAddress broadAddress=InetAddress.getByName("255.255.255.255");
while(!STOP_FLAG){
try {
ds.receive(dpReceived);
}
catch(SocketTimeoutException e){
continue; //time out
}
catch (IOException e) {
e.printStackTrace();
closeSocket();
System.exit(0);
}
InetAddress addr = dpReceived.getAddress();
System.out.println("Data Received,Host Address: "+addr.getHostAddress());
//如果收到的数据是本机发出的,则将数据广播到12345端口
if(addr.getHostAddress().equals(host)){
try {
ds.send(new DatagramPacket(dpReceived.getData(),dpReceived.getLength(),broadAddress,port_trans));
} catch (IOException e) {
e.printStackTrace();
}
}
}
这样,在运行Android程序之前,先运行这个后台程序,负责将数据广播到192.168.0/24网段。
局域网发送给AVD的数据可以通过AVD的端口映射解决。比如一般模拟器的端口为5554,用telnet连接到模拟器
telnet localhost 5554
然后运行redir命令就能进行端口映射操作
这个命令有三个比较常用的子命令
redir add udp:13579:24680
//将本机13579端口映射到AVD的24680端口
即所有发送到本机13579端口的数据都将转发到24680端口上
redir del udp:13579
//移除映射关系
redir list
//列出映射关系
更多推荐
Android模拟器与局域网通信
发布评论