2014-02-16 179 views
15

我想連接我的android應用程序到本地主機的網址,這要歸功於wamp服務器,但它不起作用。我的目標是獲取json數據並解析這些數據。對於我的測試,我使用的是設備而不是模擬器和我使用的權限在AndroidManifest.xml:Android連接到本地主機

<uses-permission android:name="android.permission.INTERNET" /> 

我的網址是這樣的:

String url = "http://10.0.2.2:8080/tests/PhpProject1/connectionBDD.php"; 

我想:

http://localhost/ 
http://10.0.2.2:8080/ 
http://10.0.2.2/ 

但它迄今爲止從未奏效:

java.net.ConnectException: failed to connect to localhost/127.0.0.1 (port 80): connect failed: ECONNREFUSED (Connection refused) 

    failed to connect to /10.0.2.2 (port 8080): connect failed: ETIMEDOUT (Connection timed out) 

    java.net.ConnectException: failed to connect to /10.0.2.2 (port 80): connect failed: ETIMEDOUT (Connection timed out) 

然後我試着用在互聯網上找到的json url測試:http://headers.jsontest.com/

它工作得很好,我在這個地址得到了json數據。所以我想我的代碼是好的,這裏的問題是我的本地主機url,我不知道它應該是什麼形式.. 我讀了很多關於它的線程,但我沒有找到解決方案。

這裏我的代碼:

主要活動:

public class MainActivity extends Activity { 
    private String url = "http://10.0.2.2:8080/tests/PhpProject1/connectionBDD.php"; 

    private ListView lv = null; 
    private Button bGetData; 

    @Override 
    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     final JsonDownloaderTask task = new JsonDownloaderTask(this); 
     lv = (ListView) findViewById(R.id.list); 

     bGetData = (Button)findViewById(R.id.getdata); 
     bGetData.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) {    
       task.execute(url);      
      } 
     }); 
    } 

    public void jsonTaskComplete(JSONArray data){ 
     //todo 
    } 
} 

的AsyncTask:

public class JsonDownloaderTask extends AsyncTask<String, String, JSONArray> { 

    MainActivity ma; 

    public JsonDownloaderTask(MainActivity main){ 
     ma = main; 
    } 

    @Override 
    protected JSONArray doInBackground(String... url) { 
     JSONParser jParser = new JSONParser(); 
     // Getting JSON from URL 
     JSONArray jsonArray = null; 
     try { 
      jsonArray = jParser.getJSONFromUrl(url[0]); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return jsonArray;   
    } 

    protected void onPostExecute(JSONArray data){ 

     ma.jsonTaskComplete(data); 
    } 
} 

JSONParser:

public class JSONParser { 
    String data = ""; 
    JSONArray jsonArray = null;   
    InputStream is = null; 

    public JSONParser(){} 

    // Method to download json data from url 
    public JSONArray getJSONFromUrl(String strUrl) throws IOException{ 
     try{ 
      URL url = new URL(strUrl); 

      // Creating an http connection to communicate with url 
      HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 

      // Connecting to url 
      urlConnection.connect(); 

      // Reading data from url 
      is = urlConnection.getInputStream(); 

      BufferedReader br = new BufferedReader(new InputStreamReader(is)); 

      StringBuffer sb = new StringBuffer(); 

      String line = ""; 
      while((line = br.readLine()) != null){ 
       sb.append(line); 
      } 
      is.close(); 
      data = sb.toString(); 

      //br.close(); 

      jsonArray = new JSONArray(data); 

     }catch(Exception e){ 
      Log.d("Exception while downloading url", e.toString()); 
     }finally{ 
      is.close(); 
     } 

     return jsonArray; 
    } 
} 

回答

3

首先,您必須在eclipse設置中綁定運行服務器的機器的IP地址。

你可以這樣做。

Eclipse Run Configuration

在eclipse然後運行配置右鍵單擊PHP項目,然後在Web Application在那裏你會找到Argument標籤。現在給出您的服務器運行的機器的端口和LAN IP地址。

這樣--port = 8888 --address = 192.168.1.6東西然後更新網址http://192.168.1.6:8080/tests/PhpProject1/connectionBDD.php

在這裏,在我的情況,這是我的局域網IP地址192.168.1.6,然後您就可以到找到它使用網絡命令如ipconfig,ifconfig並使用該IP地址。

+0

感謝您的回答,我現在用NetBeans管理這個,urlConnection.connet();工作正常,但我有另一個異常:java.net.SocketException:recvfrom失敗:ECONNRESET(連接重置由同行),也許你知道這個問題 – AlexDG

+0

嗯,對於這個新問題,你可以在這裏閱讀http://stackoverflow.com/questions/11207394/getting-socketexception-connection-reset-by-peer-in-android現在你可以接受答案 –

+0

謝謝你的幫助。 – AlexDG

5

如果你試圖連接到 「localhost」 的,它將解析爲th e Android設備,而不是你自己的本地主機(除非你在模擬器中運行)。我推薦進行開發的是在操作欄中添加一個溢出菜單,該菜單中有一個名爲「Settings」的條目,該條目提供了用於指定應用程序設置的Settings活動,並在「Settings」中有一個「Developer options」條目,要使用的自定義服務器地址。在開發過程中,您可以使用此選項爲您的應用輸入自定義服務器地址。 (您將需要一個真正的服務器地址,通過互聯網實際可達,而不是使用本地主機)。

9

IP地址10.0.2.2用於從仿真器獲取數據。 Localhost將始終指向運行應用程序的模擬器/ Android設備。 爲了讓你的設備從你的電腦獲取數據,它應該在同一個網絡(通過WiFi連接到你的路由器),你應該使用你的電腦的本地IP地址(通常是一個192.168.1.x號碼)。

+1

我已經嘗試過用我的lappy的ip地址,但它仍然沒有連接 – Dev

+0

相同,沒有連接 – CularBytes

+0

沒有連接! – Eddy

0

我知道的一個簡單的方法是保持移動數據並共享WiFi。連接你的筆記本電腦或電腦到這個wifi。現在看到你的筆記本電腦或臺式機的ip。從你的手機撥打服務。由於您的手機和電腦現在在同一網絡中。

1

我假設你正試圖從android模擬器或真實設備上訪問PC上可用的網絡服務。

對於Android模擬器,你必須只使用 「localhost」,因爲 「本地主機」 是指Android模擬器本身, PC主機。

您需要修改/ etc/hosts文件或模擬器或真實設備。添加一行,如「192.168.0.100 service.local」。

0

我試圖「10.0.2.2:80/mysitename/page.php」 奇蹟發生了,它的工作現在。 我在Mac上並使用XAMPP作爲服務器。

您可以更改端口號。到80並嘗試。8080端口不適合我!

乾杯。

1

如果您使用手機而不是模擬器並在本地主機上運行服務,那麼使用url而不是'10 .0.2.2'來使用PC的IP地址。