android模拟器与pc,模拟器与模拟之间用socket进行通信和获得模拟器ip地址程序

一、PC电脑和Android模拟器访问及模拟器之间tcp/udp通信

http://orgcent.com/pc-android-emulator-socket/

Android系统默认只能通过IP(10.0.2.2)单向访问PC电脑,而PC电脑不能通过IP来直接访问Android模拟器系统。要想实现PC电脑和Android模拟器系统以及Android模拟器之间相互通信必须借助端口重定向(redir)来实现。

先说说端口重定向所需要的telnet客户端安装:
windows:
安装telnet客户端。如果没有安装,可以在windows程序管理中的打开或关闭系统功能下找到telnet客户端菜单项来启用telnet客户端功能。
linux:
自行安装telnet客户端。

一、PC电脑不能直接访问Android模拟器系统的原因
Android系统为实现通信将PC电脑IP设置为10.0.2.2,自身为10.0.2.15/127.0.0.1。然而PC电脑并没有为Android模拟器系统指定IP,所以PC只能通过端口重定向来实现和Android模拟器的通信。

二、PC电脑和Android模拟器系统之间通信

1、运行模拟器

2、打开window 命令行,执行:

telnet localhost 5554

5554是模拟器的端口(位于Android模拟器窗口标题栏),执行之后会进入android console

3、在console下执行:

格式:redir add < udp/tcp >:< pc端口 >:< 模拟器端口 >
例如:redir add udp:2888:2888
     redir add tcp:2888:2888

执行此命令之后,会把PC 2888 端口接收到的tcp/udp数据转到模拟器的2888端口。

三、多个Android模拟器系统之间通信

1、启动模拟器emulator-5554和emulator-5556

2、打开dos窗口执行telnet localhost 5554连接到模拟器5554

3、成功连接后,继续执行:redir add tcp:5000:6000将PC端口5000绑定到模拟器5554的端口6000上。

4、此时模拟器5556通过向PC电脑端口5000(即地址:10.0.2.2:5000)发送tcp/udp数据包跟模拟器5554通信。

5、同理根据步骤2、3来实现PC电脑对模拟器5556的端口转发。

添加成功后,我们可以用redir list命令来列出已经添加的映射端口,redir del可以进行删除。

相信只要理解了PC电脑和Android模拟器系统之间通信,便知道怎么实现多个模拟器之间通信。

 

二、http://japankn.iteye.com/blog/1744031

 在本机上启动两个模拟器,本机(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:

        PC-SERVER:ServerSocket server = new ServerSocket(7100);

        模拟器-CLIENT: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:ServerSocket server = new ServerSocket(7100);

        PC-CLIENT:Socket socket = new Socket("127.0.0.1", 6100);

 

        方法2(错误):

        模拟器-SERVER:ServerSocket server = new ServerSocket(7100);

        PC-CLIENT: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也是一样)。

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

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

 

        方法1(正确):

        模拟器(5554)-SERVER:ServerSocket server = new ServerSocket(7100);

        模拟器(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)上。实现了两个模拟器之间的网络通信功能。

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

 

        方法2(错误):

        模拟器(5554)-SERVER:ServerSocket server = new ServerSocket(7100);

        模拟器(5556)-CLIENT:Socket socket = new Socket("192.168.1.3", 6100);

 

        错误原因跟【PC-CLIENT / 模拟器-SERVER】的方法2一样。

 

Android模拟器Ping主机

        众所周之Android模拟器采用的是Qemu,而整个模拟的内核是Linux,虽然没有x-windows界面和bash shell,但测试下基本的Linux Shell还是没有问题的,今天就在android emulator上玩回ping。

        首先我们进入cmd或console状态下,使用cd命令进入Android SDK的Tools命令,可以输入adb shell这时候,这个时候从>变为了#,现在已经在linux shell中了,虽然Android平台没有vi这样的编辑器,但是执行些简单的命令比如cd、rmdir、mkdir还是没有问题,我们直接在Android模拟器中测试ping本机,如# ping localhost,看看返回如图:

[环境相关] 安卓模拟器ping局域网中的其他机器

 

获取android模拟器ip

public String getLocalIpAddress() {
    try {
        for (Enumeration<NetworkInterface> en =NetworkInterface.getNetworkInterfaces();en.hasMoreElements();){

            NetworkInterface intf = en.nextElement();
            for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses();enumIpAddr.hasMoreElements();){

                InetAddress inetAddress = enumIpAddr.nextElement();
                if (!inetAddress.isLoopbackAddress()) {
                    return inetAddress.getHostAddress().toString();
                }
            }
        }
    } catch (SocketException ex) {
        edit_show.append(ex.toString()+"\n");
    }
    return null;
}

 

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页