Android模擬器的ip獲取以及模擬器之間socket通信


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM