Android模拟器的ip获取以及模拟器之间socket通讯

一、Android  获取本机Mac 地址方法:java

须要在AndroidManifest.xml文件中添加权限:    android

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />  shell

Java代码服务器

public String getLocalMacAddress() {  
        WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);  
        WifiInfo info = wifi.getConnectionInfo();  
        return info.getMacAddress();  
    }

二、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) {  
            Log.e("WifiPreference IpAddress", ex.toString());  
        }  
        return null;  
    }

--------------------------------------------------tcp

实现网络五子棋时用到了两个设备间的Socket通讯,若是使用真机调试比较麻烦,用两个模拟器之间进行通讯会比较方便。oop

首先要得到的模拟器的IP地址spa

在本机上启动两个模拟器,emulator-5554,emulator-5556查看模拟器ip命令行

在命令行窗口输入命令调试

adb –s emulator-5554 shell

getprop

找到一下两行:

[net.eth0.dns1]: [10.0.2.3]

[net.gprs.local-ip]: [10.0.2.15]

 

能够发现两个模拟器的IP地址彻底同样,都为10.0.2.15,DNS都为10.0.2.3,因此要实现两个模拟器之间的通讯,使用模拟器的IP地址是办不到的。

模拟器提供了一个特殊的IP,这个IP地址为10.0.2.2,这个IP地址能够说等同于PC本机的IP地址127.0.0.1,因此,经过这个特殊的IP地址能够进行PC与模拟器之间的通讯。

考虑模拟器做为主机的状况:

须要把模拟器的端口映射到PC的端口,经过链接PC端的端口来把请求重定向发送给,模拟器。

1)PC做为客户端,模拟器1为主机

2)模拟器2为客户端,模拟器1为主机

 

 

映射PC端口到模拟器端口的命令以下:

>adb –semulator-5554 forward tcp:6665 tcp:6666

映射成功后,链接模拟器的端口6666就要经过链接PC的端口6665进行链接,客户端链接的IP必须为环路IP,不能使用本机IP,如192.168.1.102,由于本机IP跟环路IP没有映射关系,因此发送到本机IP(192.168.1.102)的链接请求没法映射到127.0.0.1的环路IP上,使用PC端程序做为客户端时,环路IP必须使用127.0.0.1,使用模拟器做为客户端时,环路IP使用10.0.2.2,虽然二者是同一个环路IP,可是PC只能识别127.0.0.1,模拟器只能识别10.0.2.2。

3)若是要实现两个模拟器之间的相互通讯,就必须每一个模拟器都既为Server又为Client,并在PC机上映射为不一样的端口。结构图以下

 

因为PC的本机IP(192.168.1.102)没有映射到环路IP,因此不能在Android真机与模拟器之间或者运行在两台PC的模拟器之间进行Socket通讯,若是要实现链接,必须在做为服务器的PC上,运行一个用于数据中继的后台程序,进行数据的转发。

相关文章
相关标签/搜索