Android模擬器的ip獲取以及模擬器之間socket通信 http://kalogen.iteye.com/blog/1565507
作者:李波
實現網絡五子棋時用到了兩個設備間的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 –s emulator-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上,運行一個用於數據中繼的后台程序,進行數據的轉發。
Android模擬器(simulator)把它自己作為了localhost,也就是說,代碼中使用localhost或者127.0.0.1來訪問,都是訪問模擬器自己!這是不行的!
如果你想在模擬器simulator上面訪問你的電腦,那么就使用android內置的IP 10.0.2.2 吧,10.0.2.2 是模擬器設置的特定ip,是你的電腦的別名alias
記住,在模擬器上用10.0.2.2訪問你的電腦本機。
詳細請參考Android文檔android-sdk-windows\docs\guide\developing\devices\emulator.html下的Emulator Networking
Network Address Description
10.0.2.1 Router/gateway address
10.0.2.2 Special alias to your host loopback interface (i.e., 127.0.0.1 on your development machine)
10.0.2.3 First DNS server
10.0.2.4 / 10.0.2.5 / 10.0.2.6 Optional second, third and fourth DNS server (if any)
10.0.2.15 The emulated device's own network/ethernet interface
127.0.0.1 The emulated device's own loopback interface