1. 程式人生 > >Android模擬器的ip獲取以及模擬器之間socket通訊

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上,執行一個用於資料中繼的後臺程式,進行資料的轉發。