我添加了一個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地址應該是什麼?
您是否向servlet發送了一個post請求? – 2015-03-13 19:26:10
[Android應用程序和Java服務器問題的可能重複。連接被拒絕](http:// stackoverflow。com/questions/8067113/android-application-and-java-server-issue-connection-refused) – 2015-03-13 19:31:32
我很抱歉,可能我還不夠清楚,但我的問題並不重複。事實上,我試圖找到答案是從物理設備訪問我的開發機器(後端),而不是從模擬器訪問。 因此,在所謂的重複問題中提供的答案不適用於我的情況,因爲IP地址10.0.2.2是主機回送接口的別名,也是針對開發機器的,但僅限於仿真器。 我需要的是10.0.2.2的一個等價物,適合從我的手機使用,這是一個NAT-ed IP地址,指向開發機器的本地主機。 – 2015-03-14 16:13:30