mars課程里關(guān)于Socket通信那一課說那些程序只能在真機(jī)上運(yùn)行,模擬器模擬不了,實(shí)際上是可以的。
Android模擬器是通過一個(gè)類似路由器的虛擬網(wǎng)絡(luò)層與電腦相連,可以看作模擬器是處于“內(nèi)網(wǎng)”當(dāng)中,每個(gè)模擬器都有自己的虛擬路由器,而且虛擬路由器的地址總是10.0.2.1,在模擬器看來,電腦的地址是10.0.2.2,模擬器自己的地址是10.0.2.15,無論你啟動(dòng)多少個(gè)模擬器,對于模擬器來說都是這樣的地址,模擬器之間不能直接通信。
啟動(dòng)模擬器的時(shí)候,電腦會給模擬器分配兩個(gè)端口,通過這兩個(gè)端口,電腦就能操作模擬器。第一個(gè)啟動(dòng)的模擬器的端口是5554和5555,第二個(gè)是5556和5557,以此類推,最多可以同時(shí)啟動(dòng)32個(gè)模擬器。第一個(gè)端口(偶數(shù)端口)可以接受telnet連接,對模擬器進(jìn)行設(shè)置,第二個(gè)端口(奇數(shù)端口)則接受adb連接,可以用來調(diào)試。第一個(gè)端口可以在模擬器窗口的標(biāo)題欄看到,如下圖所示:

5554表示端口號,t表示模擬器名稱。
實(shí)際上,這些端口也是電腦監(jiān)聽的端口,在電腦上通過netstat可以看到本機(jī)正在監(jiān)聽這些端口,因此通過telnet localhost 5554就能連上第一臺模擬器,連上之后通過help命令可以查看操作幫助。
為了實(shí)現(xiàn)電腦和模擬器上的android程序進(jìn)行socket通信,需要把程序開啟的端口通過端口映射設(shè)置到電腦上,這跟家里的路由器端口映射概念是一樣的。telnet到模擬器之后,通過
redir add tcp:1234:1234
就能把模擬器上的1234端口映射到電腦上,第一個(gè)表示電腦端口,第二個(gè)表示模擬器程序要使用端口,這兩個(gè)數(shù)字可以相同也可以不同,要映射udp端口就把tcp改為udp即可
redir add udp:1234:1234
這樣一來,當(dāng)模擬器的程序打開1234端口時(shí),在電腦上也打開了對應(yīng)的端口,只要通過電腦連接127.0.0.1的對應(yīng)端口,就連上了模擬器的程序端口,就可以通過電腦上的client向模擬器的server發(fā)送數(shù)據(jù),不需要通過真機(jī)運(yùn)行。
如果要讓第一個(gè)模擬器向第二個(gè)模擬器發(fā)送數(shù)據(jù),也可以把第二個(gè)模擬器的端口映射到電腦上,然后在第一個(gè)模擬器程序中向10.0.2.2的對應(yīng)端口發(fā)送數(shù)據(jù)即可。
模擬器還有一個(gè)很有意思的功能,每個(gè)模擬器默認(rèn)的電話號碼就是它的第一個(gè)端口號,例如開了兩個(gè)模擬器,第一個(gè)撥打5556,第二個(gè)就會顯示5554來電,還能接通,發(fā)短信也可以,這樣就能模擬電話和短信功能。
詳細(xì)的信息可以看Dev Guide的模擬器部分:
http://developer.android.com/guide/developing/devices/emulator.html