0

我添加了一個Java應用程序引擎的servlet後端到我的應用程序,並在我的「客戶端」我有一個ServletPostAsyncTask類進行HTTP請求到我的後端。訪問的Servlet後端的IP地址從一個物理設備(而不是從仿真器)

如果我使用模擬器,我可以通過IP地址10.0.2.2:8080訪問我的後端,但是如果我在物理設備上運行,則會收到「http://10.0.2.2:8080連接被拒絕」錯誤。

現在,我不能使用本地主機或127.0.0.1或10.0.2.2,因爲與本地主機我會試圖連接到我自己的智能手機,10.0.2.2是我的主機回送接口的特殊別名,因此,僅適用於仿真器。但是,那麼沒有任何別名地址是從物理設備指向我的開發機器的?

我只是無法環繞它。

這是我的代碼。類ServletPostAsyncTask在「客戶端」執行HTTP請求:

class ServletPostAsyncTask extends AsyncTask<Pair<Context, String>, Void, String> { 
private Context context; 

@Override 
protected String doInBackground(Pair<Context, String>... params) { 
    context = params[0].first; 
    String name = params[0].second; 

    HttpClient httpClient = new DefaultHttpClient(); 
    HttpPost httpPost = new HttpPost("http://myIPaddress:8080/hello"); 
    // http://10.0.2.2:8080 is localhost's IP address in Android emulator 
     try { 
     // Add name data to request 
      List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1); 
      nameValuePairs.add(new BasicNameValuePair("name", name)); 
      httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

      // Execute HTTP Post Request 
      HttpResponse response = httpClient.execute(httpPost); 
     if (response.getStatusLine().getStatusCode() == 200) { 
      return EntityUtils.toString(response.getEntity()); 
     } 
      return "Error: " + response.getStatusLine().getStatusCode() + " " + response.getStatusLine().getReasonPhrase(); 

     } catch (ClientProtocolException e) { 
      return e.getMessage(); 
     } catch (IOException e) { 
      return e.getMessage(); 
     } 
    } 

@Override 
protected void onPostExecute(String result) { 

     Toast.makeText(context, result, Toast.LENGTH_LONG).show(); 
    } 
} 

因此這個問題,當我所提到的任何地址的運行我得到這個錯誤: 「http://myIPaddress:8080連接被拒絕」

  • 我已經在我的清單文件中有<uses-permission android:name="android.permission.INTERNET" />
  • 我知道10.0.2.2與127.0.0.1相當,當我使用模擬器時,但我不想從模擬器運行,我試圖運行一個物理設備。事實上,這段代碼在我的模擬器中工作,但不在我的物理設備中。

爲什麼沒有一個類似的別名從物理設備使用?如果沒有,那麼我的IP地址應該是什麼?

+0

您是否向servlet發送了一個post請求? – 2015-03-13 19:26:10

+0

[Android應用程序和Java服務器問題的可能重複。連接被拒絕](http:// stackoverflow。com/questions/8067113/android-application-and-java-server-issue-connection-refused) – 2015-03-13 19:31:32

+0

我很抱歉,可能我還不夠清楚,但我的問題並不重複。事實上,我試圖找到答案是從物理設備訪問我的開發機器(後端),而不是從模擬器訪問。 因此,在所謂的重複問題中提供的答案不適用於我的情況,因爲IP地址10.0.2.2是主機回送接口的別名,也是針對開發機器的,但僅限於仿真器。 我需要的是10.0.2.2的一個等價物,適合從我的手機使用,這是一個NAT-ed IP地址,指向開發機器的本地主機。 – 2015-03-14 16:13:30

回答

3

我解決了它。 我發現我連接的路由器阻塞了流量。 我嘗試過使用其他路由器和移動服務提供商的網絡:通過同一網絡連接我的筆記本電腦和我的設備完成了部分工作。

我也不得不更改配置(運行 - >更改配置),並創建一個新的後端配置。

這個後端的配置需要有一個服務器地址聽電腦的IP地址,而不是默認的「localhost」的。顯然,只有這樣,客戶端和後端地址纔會匹配。 當然,http請求需要位於後端正在偵聽的同一個IP地址上。

+0

我很高興。這聽起來像一個可怕的問題。 – 2015-03-15 03:48:16

+0

在這些配置設置中,有一個選項可以與gradle.configuration同步。我認爲這意味着您可以添加到您的gradle文件的屬性,以便您可以接受所有傳入流量,而不僅僅是本地主機。你知道gradle配置應該是什麼樣子嗎? – 2017-01-29 07:21:39

+0

@DanielGeorge有點遲,我想,但我碰到了同樣的問題,所以這也可以幫助其他人:我通過在後端的gradle配置文件的appengine字段中添加httpAddress ='0.0.0.0'來解決它,如聲明[這裏](http://stackoverflow.com/questions/27591647/how-to-get-google-cloud-tools-for-android-studio-listen-on-all-ip-addresses)。我不知道爲什麼,但我試圖通過菜單更改後端的設置,但接受的答案卻是這樣,但服務器地址的字段是不可編輯的,至少在我的android studio版本中是如此。 – 2017-02-22 18:17:24

0

如果servlet被部署到谷歌應用程序引擎,你應該能夠看到在App Engine控制檯爲它的IP地址信息。你正在部署到應用程序引擎還是在本地運行servlet進行調試?

無論哪種方式,檢查,以確保你是一個post請求。這就是servlet設置要監聽的內容。

從瀏覽器製作一個並不容易。您可以使用CURL來嘗試,如下所示:

curl -X POST http://localhost:8080 
+0

是的,它已經是一個post請求 – 2015-03-13 19:40:45

+0

我在Android Studio本地運行servlet。 – 2015-03-13 19:47:23

+0

好吧我已經將模塊部署到Google App Engine,但在控制檯中沒有看到任何IP地址...您的意思是? – 2015-03-13 20:04:16

相關問題