Android模擬器的ip獲取以及模擬器之間socket通訊
作者:李波
實現網路五子棋時用到了兩個裝置間的Socket通訊,如果使用真機除錯比較麻煩,用兩個模擬器之間進行通訊會比較方便。
首先要獲得的模擬器的IP地址
在本機上啟動兩個模擬器,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上,執行一個用於資料中繼的後臺程式,進行資料的轉發。