2011-02-24 58 views
3

我目前正在編寫一個小型測試Android應用程序,並且已經通過模擬器運行了一個小(大)問題。Android掃描本地子網

出去掃描運行我的服務器的計算機的本地子網的代碼不會返回任何內容!該代碼在桌面部分完美運行,所以我知道我的模擬器內部有問題。

我必須首先對IP掃描進行硬編碼,因爲我無法確定模擬器中的IP地址,所以我知道我至少掃描了正確的範圍。

摘要:如何通過本地子網上的模擬器內部的套接字連接到服務器?

謝謝大家!

這裏的請求的代碼:

public static ArrayList<String> serviceScanner() { 
    ArrayList<String> servers = new ArrayList<String>(); 

    // Get the IP of the local machine 
    String iIPv4 = ""; 
    String test = ""; 


    //getLocalIpAddress(); 
    //System.out.println(test); 

    try { 
     // Get localhost 
     InetAddress addr = InetAddress.getLocalHost(); 

     // Get IP Address 
     byte[] ipAddr = addr.getAddress(); 

     iIPv4 = addr.toString(); 
     iIPv4 = iIPv4.substring(iIPv4.indexOf("/") + 1); 
     iIPv4 = "10.0.2.1"; 
    } catch (UnknownHostException e) { 
     // Exception output 
    } 
    // IP stuff. 
    String IPv4Start = "", IPv4End = ""; 
    iIPv4 = iIPv4.substring(0, iIPv4.lastIndexOf(".")); 
    iIPv4 += "."; 
    IPv4Start = iIPv4 + "1"; 
    IPv4End = iIPv4 + "254"; 


    PrintWriter out = null; 
    BufferedReader in = null; 

    // Loop to scan each address on the local subnet 
    for (int i = 1; i < 255; i++) { 

     try { 
      System.out.println(iIPv4+i); 
      Socket mySocket = new Socket(); 
      SocketAddress address = new InetSocketAddress(iIPv4 + i, port); 

      mySocket.connect(address, 5); 

      out = new PrintWriter(mySocket.getOutputStream(), true); 
      in = new BufferedReader(new InputStreamReader(
        mySocket.getInputStream())); 
      out.println("Scanning!"); 
      String fromServer; 
      while ((fromServer = in.readLine()) != null) { 
       System.out.println("Server: " + fromServer); 
       if (fromServer.equals("Server here!")) { 
        servers.add(iIPv4 + i); 
        mySocket.close(); 
        break; 
       } 
      } 
      mySocket.close(); 
      out.close(); 
      in.close(); 

     } catch (UnknownHostException e) { 
     } catch (IOException e) { 
     } 
    } 
    return servers; 
} 

}

回答

3

模擬器是不是在同一個子網與您的計算機。它是通過自己的NAT路由器連接到計算機上的自己的虛擬子網。這裏有一個解釋:http://developer.android.com/guide/developing/devices/emulator.html#emulatornetworking

但是,仿真器,通過它的路由器,應該能夠連接到互聯網上任何地方的任何插座。您嘗試連接的地址是什麼?模擬器不會路由10.0.0.0專用地址,因爲它將自己用於自己。不確定關於168.192.0.0。你可以發佈失敗的代碼嗎?

+0

感謝您的回覆。 我試圖連接到10.115.23。*範圍內的機器。 – David

+0

那麼這就是爲什麼NA​​T後面的私人地址很糟糕,最好是爲每臺機器使用公共地址。你有兩個網絡都使用相同的地址空間。建議: 1.重新編號您的網絡使用不同的子網。 2. 在真實設備上進行調試 - 這比使用模擬器並不困難,並且通常更好 – Richard

+0

我不能。我們的網絡設置爲使用10.115.23範圍,目前我沒有任何物理設備需要測試。 我試圖通過套接字連接到10.0.2.2的本地機器,現在我不能!有什麼不對.. – David