【本機(PC)IP以及Android模擬器IP的說明】
在本機上啟動兩個模擬器,本機(PC)和模擬器的信息如下:
大家可以看到,兩個模擬器的IP地址都是完全一樣的,所以要實現兩個模擬器之間的通信,使用模擬器的IP地址是辦不到的。
獲取模擬器名稱:
>adb devices
List of devices attached
emulator-5554 device
emulator-5556 device
模擬器提供了一個特殊的IP,此IP的地址為10.0.2.2,此IP地址可以說等同於PC本機的IP地址127.0.0.1 。所以,通過此特殊IP地址,實現PC本機與模擬器的通信是沒有問題。
【PC-SERVER / 模擬器-CLIENT】
目的:通過7100端口跟服務器進行通信。
實施方法比較簡單,直接按照下面的方法就可以了。
方法1:
PC-SERVER:
ServerSocket server = new ServerSocket(7100);
模擬器-CLIENT:
Socket socket = new Socket("192.168.1.3", 7100);
方法2:
PC-SERVER:
ServerSocket server = new ServerSocket(7100);
模擬器-CLIENT:
Socket socket = new Socket("10.0.2.2", 7100);
【模擬器-SERVER / PC-CLIENT】
目的:連接到服務器的7100端口。
實施操作稍微復雜一些,不能按照前面的方法來進行。要達到此目的,先要進行端口映射。
把本機端口TCP/6100映射到模擬器TCP/7100端口(UDP也是一樣)。
>adb –s emulator-5554 forward tcp:6100 tcp:7100
端口映射成功後,再進行下面的實驗。
方法1(正確):
模擬器-SERVER:
ServerSocket server = new ServerSocket(7100);
PC-CLIENT:
Socket socket = new Socket("127.0.0.1", 6100);
方法2(錯誤):
模擬器-SERVER:
ServerSocket server = new ServerSocket(7100);
PC-CLIENT:
Socket socket = new Socket("192.168.1.3", 6100);
錯誤原因是127.0.0.1是本機環路IP,跟本機IP沒有映射關系,所以發送到本機IP的連接請求,無法映射到127.0.0.1的環路IP上。
由於這個原因,兩台PC機上的模擬器之間,是無法進行網絡連接的。如果要實現連接,只能在作為服務器的PC上,運行一個用於數據中繼的後台程序,進行數據的轉發。
【模擬器(5554)-SERVER / 模擬器(5556)-CLIENT】
目的:模擬器(5556)連接到模擬器(5554)的7100端口。
實施操作也相對復雜一些。要達到此目的,也要先進行端口映射。
把本機端口TCP/6100映射到模擬器(5554)TCP/7100端口(UDP也是一樣)。
>adb –s emulator-5554 forward tcp:6100 tcp:7100
端口映射成功後,再進行下面的實驗。
方法1(正確):
模擬器(5554)-SERVER:
ServerSocket server = new ServerSocket(7100);
模擬器(5556)-CLIENT:
Socket socket = new Socket("10.0.2.2", 6100);
原理說明:
模擬器(5556)通過連接10.0.2.2:6100,相當於連接本機(PC)的127.0.0.1:6100,由於本機IP的6100端口進行過端口映射,映射到模擬器(5554)的7100端口。所以,來自模擬器(5556)的連接請求會發送到模擬器(5554)上。實現了兩個模擬器之間的網絡通信功能。
此方法在本機調試時非常有用。
方法2(錯誤):
模擬器(5554)-SERVER:
ServerSocket server = new ServerSocket(7100);
模擬器(5556)-CLIENT:
Socket socket = new Socket("192.168.1.3", 6100);
錯誤原因跟【PC-CLIENT / 模擬器-SERVER】的方法2一樣。