从物理设备(而不是模拟器)访问Servlet后端的IP地址

时间:2015-03-13 19:22:26

标签: google-app-engine servlets android-studio httprequest android-networking

我在我的应用程序和我的"客户端"中添加了一个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" />
  • 我知道当我使用模拟器时10.0.2.2相当于127.0.0.1但是我没有尝试从模拟器运行,我试图在物理设备上运行。实际上,此代码在我的模拟器中工作,但不在我的物理设备中。

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

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

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

无论哪种方式,请检查以确保您正在发布帖子请求。这就是servlet设置用来监听的内容。

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

curl -X POST http://localhost:8080