从物理设备(而不是模拟器)访问 Servlet 后端的 ip 地址
access to Servlet backend's ip address from a physical device (not from emulator)
我在我的应用程序中添加了一个 Java App Engine servlet 后端,在我的 "client" 中,我有一个 ServletPostAsyncTask class 向我的后端执行 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 是我的主机环回接口的特殊别名,并且是因此仅适用于模拟器。但是,是否没有创建任何别名地址以从物理设备指向我的开发机器?
我就是想不通。
这是我的代码。 Class "client" 中的 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 部署到 google 应用引擎,您应该能够在应用引擎控制台中看到它的 IP 地址信息。您是在本地部署到应用程序引擎还是 运行 servlet 进行调试?
无论哪种方式,请检查以确保您正在发出 post 请求。这就是 servlet 设置要监听的内容。
从浏览器制作一个并不容易。您可以使用 CURL 尝试它,如下所示:
curl -X POST http://localhost:8080
我已经解决了。
我发现我连接的路由器正在阻止流量。
我已经尝试过使用另一个路由器和我的移动服务提供商的网络:通过同一网络连接我的笔记本电脑和我的设备完成了部分工作。
我还必须更改配置(运行 -> 更改配置)并创建新的后端配置。
此后端的配置需要有一个服务器地址来侦听计算机的 IP 地址,而不是默认的 "localhost"。显然,只有这样客户端和后端地址才会匹配。
当然,http 请求需要通过后端正在侦听的同一 IP 地址。
我在我的应用程序中添加了一个 Java App Engine servlet 后端,在我的 "client" 中,我有一个 ServletPostAsyncTask class 向我的后端执行 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 是我的主机环回接口的特殊别名,并且是因此仅适用于模拟器。但是,是否没有创建任何别名地址以从物理设备指向我的开发机器?
我就是想不通。
这是我的代码。 Class "client" 中的 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 部署到 google 应用引擎,您应该能够在应用引擎控制台中看到它的 IP 地址信息。您是在本地部署到应用程序引擎还是 运行 servlet 进行调试?
无论哪种方式,请检查以确保您正在发出 post 请求。这就是 servlet 设置要监听的内容。
从浏览器制作一个并不容易。您可以使用 CURL 尝试它,如下所示:
curl -X POST http://localhost:8080
我已经解决了。 我发现我连接的路由器正在阻止流量。 我已经尝试过使用另一个路由器和我的移动服务提供商的网络:通过同一网络连接我的笔记本电脑和我的设备完成了部分工作。
我还必须更改配置(运行 -> 更改配置)并创建新的后端配置。
此后端的配置需要有一个服务器地址来侦听计算机的 IP 地址,而不是默认的 "localhost"。显然,只有这样客户端和后端地址才会匹配。 当然,http 请求需要通过后端正在侦听的同一 IP 地址。