我在我的应用程序和我的"客户端"中添加了一个Java应用程序引擎servlet后端。我有一个ServletPostAsyncTask类向我的后端执行http请求。
如果我使用模拟器,我可以通过IP地址10.0.2.2:8080访问我的后端,但是如果我在物理设备上运行,我会收到" http://10.0.2.2:8080连接被拒绝"错误。
现在,我无法使用localhost或127.0.0.1或10.0.2.2,因为使用localhost我会尝试连接到我自己的智能手机,而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();
}
}
作为此问题的结果,当我运行任何提到的地址时,我收到此错误: &#34; http://myIPaddress:8080连接被拒绝&#34;
<uses-permission android:name="android.permission.INTERNET" />
为什么在物理设备上没有类似的别名?如果没有,那么我的IP地址应该是什么?
答案 0 :(得分:3)
我已经解决了。 我发现我连接的路由器阻塞了流量。 我已尝试使用其他路由器和我的移动服务提供商的网络:通过同一网络连接我的笔记本电脑和我的设备完成了部分工作。
我还必须更改配置(运行 - >更改配置)并创建新的后端配置。
这个后端的配置需要有一个服务器地址来监听计算机的IP地址而不是默认的&#34; localhost&#34;。显然,只有这样客户端和后端地址才会匹配。 当然,http请求需要在后端正在侦听的同一IP地址上。
答案 1 :(得分:0)
如果将servlet部署到谷歌应用引擎,您应该能够在应用引擎控制台中看到它的IP地址信息。您是在部署到应用程序引擎还是在本地运行servlet进行调试?
无论哪种方式,请检查以确保您正在发布帖子请求。这就是servlet设置用来监听的内容。
从浏览器制作一个并不容易。您可以使用CURL尝试它,如下所示:
curl -X POST http://localhost:8080