Android模拟器与局域网通信

编程入门 行业动态 更新时间:2024-10-24 08:26:02
每个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广播,像下面这样直接发肯定是不行的

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模拟器与局域网通信

本文发布于:2023-06-13 19:43:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1396271.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:模拟器   局域网   通信   Android

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!