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上,運行一個用於數據中繼的後臺程序,進行數據的轉發。

相關文章
相關標籤/搜索