从物理设备(而不是模拟器)访问 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 连接被拒绝”

为什么没有类似的别名可用于物理设备?如果没有,那么我的 IP 地址应该是什么?

如果 servlet 部署到 google 应用引擎,您应该能够在应用引擎控制台中看到它的 IP 地址信息。您是在本地部署到应用程序引擎还是 运行 servlet 进行调试?

无论哪种方式,请检查以确保您正在发出 post 请求。这就是 servlet 设置要监听的内容。

从浏览器制作一个并不容易。您可以使用 CURL 尝试它,如下所示:

curl -X POST http://localhost:8080

我已经解决了。 我发现我连接的路由器正在阻止流量。 我已经尝试过使用另一个路由器和我的移动服务提供商的网络:通过同一网络连接我的笔记本电脑和我的设备完成了部分工作。

我还必须更改配置(运行 -> 更改配置)并创建新的后端配置。

此后端的配置需要有一个服务器地址来侦听计算机的 IP 地址,而不是默认的 "localhost"。显然,只有这样客户端和后端地址才会匹配。 当然,http 请求需要通过后端正在侦听的同一 IP 地址。