天天看點

android模拟器與pc,模拟器與模拟之間用socket進行通信和獲得模拟器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一樣。

Android模拟器Ping主機

        衆所周之Android模拟器采用的是Qemu,而整個模拟的核心是Linux,雖然沒有x-windows界面和bash shell,但測試下基本的Linux Shell還是沒有問題的,今天就在android emulator上玩回ping。

        首先我們進入cmd或console狀态下,使用cd指令進入Android SDK的Tools指令,可以輸入adb shell這時候,這個時候從>變為了#,現在已經在linux shell中了,雖然Android平台沒有vi這樣的編輯器,但是執行些簡單的指令比如cd、rmdir、mkdir還是沒有問題,我們直接在Android模拟器中測試ping本機,如# ping localhost,看看傳回如圖:

android模拟器與pc,模拟器與模拟之間用socket進行通信和獲得模拟器ip位址程式...

[環境相關] 安卓模拟器ping區域網路中的其他機器

擷取android模拟器ip

public String getLocalIpAddress() {

    try {

        for (Enumeration<NetworkInterface> en =NetworkInterface.getNetworkInterfaces();en.hasMoreElements();){

            NetworkInterface intf = en.nextElement();

            for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses();enumIpAddr.hasMoreElements();){

                InetAddress inetAddress = enumIpAddr.nextElement();

                if (!inetAddress.isLoopbackAddress()) {

                    return inetAddress.getHostAddress().toString();

                }

            }

        }

    } catch (SocketException ex) {

        edit_show.append(ex.toString()+"\n");

    }

    return null;

}

繼續閱讀