天天看点

本机两个Android模拟器之间的网络通信

【本机(pc)ip以及android模拟器ip的说明】

在本机上启动两个模拟器,本机(pc)和模拟器的信息如下:

大家可以看到,两个模拟器的ip地址都是完全一样的,所以要实现两个模拟器之间的通信,使用模拟器的ip地址是办不到的。

获取模拟器名称:

>adb devices

list of devices attached

emulator-5554 device

emulator-5556 device

模拟器提供了一个特殊的ip,此ip的地址为10.0.2.2,此ip地址可以说等同于pc本机的ip地址127.0.0.1 。所以,通过此特殊ip地址,实现pc本机与模拟器的通信是没有问题。

【pc-server / 模拟器-client】

目的:通过7100端口跟服务器进行通信。

实施方法比较简单,直接按照下面的方法就可以了。

方法1:

pc-server:

serversocket server = new serversocket(7100);

模拟器-client:

socket socket = new socket("192.168.1.3", 7100);

方法2:

socket socket = new socket("10.0.2.2", 7100);

【模拟器-server / pc-client】

目的:连接到服务器的7100端口。

实施操作稍微复杂一些,不能按照前面的方法来进行。要达到此目的,先要进行端口映射。

把本机端口tcp/6100映射到模拟器tcp/7100端口(udp也是一样)。

>adb –s emulator-5554 forward tcp:6100 tcp:7100

端口映射成功后,再进行下面的实验。

方法1(正确):

模拟器-server:

pc-client:

socket socket = new socket("127.0.0.1", 6100);

方法2(错误):

socket socket = new socket("192.168.1.3", 6100);

错误原因是127.0.0.1是本机环路ip,跟本机ip没有映射关系,所以发送到本机ip的连接请求,无法映射到127.0.0.1的环路ip上。

由于这个原因,两台pc机上的模拟器之间,是无法进行网络连接的。如果要实现连接,只能在作为服务器的pc上,运行一个用于数据中继的后台程序,进行数据的转发。

【模拟器(5554)-server / 模拟器(5556)-client】

目的:模拟器(5556)连接到模拟器(5554)的7100端口。

实施操作也相对复杂一些。要达到此目的,也要先进行端口映射。

把本机端口tcp/6100映射到模拟器(5554)tcp/7100端口(udp也是一样)。

模拟器(5554)-server:

模拟器(5556)-client:

socket socket = new socket("10.0.2.2", 6100);

原理说明:

模拟器(5556)通过连接10.0.2.2:6100,相当于连接本机(pc)的127.0.0.1:6100,由于本机ip的6100端口进行过端口映射,映射到模拟器(5554)的7100端口。所以,来自模拟器(5556)的连接请求会发送到模拟器(5554)上。实现了两个模拟器之间的网络通信功能。

此方法在本机调试时非常有用。

错误原因跟【pc-client / 模拟器-server】的方法2一样。

继续阅读