1

在我的 IIS 中,我创建了 Web Api,它的项目 URL 是http://localhost:54444.

我可以从 Windows8 中的浏览器连接到这个 Url,但是我无法在我的 android 模拟器浏览器中通过http://10.0.2.2:54444.

我的 android 浏览器能够连接到 google.com。

我还尝试使用http://loopj.com/android-async-http/库在 Eclipse 中创建客户端:

Log.v("bopzy_debug", "Testing HTTP Connectivity");
            System.out.println("123");
            AsyncHttpClient client = new AsyncHttpClient();

            client.get("http://10.0.2.2:54444/api/values/",
           // client.get("http://google.pl",
                    new AsyncHttpResponseHandler() {
                        @Override
                        public void onSuccess(String response) {
                            Log.v("bopzy_debug", response);

                        }
                        @Override
                        public void onFailure(Throwable error, String content)
                        {
                            System.out.println("onFailure");
                            System.out.println(content);
                             Log.w("bopzy_debug", error);
                        }
                        @Override
                        public void onFinish() {
                            System.out.println("onfinish:");
                            Log.v("bopzy_debug", "Finished..");
                        }
                    });
        }

我得到的 LogCat 信息:

07-18 09:18:17.471: V/bopzy_debug(1354): Testing HTTP Connectivity
07-18 09:18:17.471: I/System.out(1354): 123
07-18 09:18:17.621: I/System.out(1354): onFailure
07-18 09:18:17.644: I/System.out(1354): <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">

07-18 09:18:17.644: I/System.out(1354): <HTML><HEAD><TITLE>Bad Request</TITLE>

07-18 09:18:17.644: I/System.out(1354): <META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>

07-18 09:18:17.644: I/System.out(1354): <BODY><h2>Bad Request - Invalid Hostname</h2>

07-18 09:18:17.652: I/System.out(1354): <hr><p>HTTP Error 400. The request hostname is invalid.</p>

07-18 09:18:17.652: I/System.out(1354): </BODY></HTML>

07-18 09:18:17.652: W/bopzy_debug(1354): org.apache.http.client.HttpResponseException: Bad Request
07-18 09:18:17.652: W/bopzy_debug(1354):    at com.loopj.android.http.AsyncHttpResponseHandler.sendResponseMessage(AsyncHttpResponseHandler.java:235)
07-18 09:18:17.652: W/bopzy_debug(1354):    at com.loopj.android.http.AsyncHttpRequest.makeRequest(AsyncHttpRequest.java:79)
07-18 09:18:17.652: W/bopzy_debug(1354):    at com.loopj.android.http.AsyncHttpRequest.makeRequestWithRetries(AsyncHttpRequest.java:95)
07-18 09:18:17.652: W/bopzy_debug(1354):    at com.loopj.android.http.AsyncHttpRequest.run(AsyncHttpRequest.java:57)
07-18 09:18:17.652: W/bopzy_debug(1354):    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:390)
07-18 09:18:17.652: W/bopzy_debug(1354):    at java.util.concurrent.FutureTask.run(FutureTask.java:234)
07-18 09:18:17.652: W/bopzy_debug(1354):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
07-18 09:18:17.652: W/bopzy_debug(1354):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
07-18 09:18:17.652: W/bopzy_debug(1354):    at java.lang.Thread.run(Thread.java:856)
07-18 09:18:17.682: I/System.out(1354): onfinish:
07-18 09:18:17.682: V/bopzy_debug(1354): Finished..

我已经添加了:

<uses-permission android:name="android.permission.INTERNET" />

到 AndroidManifest.xml 文件。

任何建议将不胜感激。

4

1 回答 1

3

OP 似乎找到了解决方案,但为了后代,这里对正在发生的事情以及如何解决它进行了更彻底的解释。

我在使用本地 Rails 服务器时遇到了类似的问题。我意识到我不明白IP地址和主机名之间的关系。它们是不同的,如果我们不小心,我们可能会遇到问题。

Host文件中IP地址与主机名的关系

主机名可以分配给 IP 地址,但 IP 地址不能分配给主机名。

主机名 --> IP 地址

这种关系似乎微不足道,但重要的是要了解这是一种单向关系。主机名将您带到 IP 地址,但 IP 地址不知道主机名。

假设我们有两个指向 127.0.0.1 的主机名:localhost 和 localdev。现在假设我有一个服务器正在监听 localhost:3000。如果我输入 localdev:3000,你希望会发生什么?

答案是什么。

Localhost 和 localdev 可能指向同一个 IP 地址,但 IP 地址不指向主机名。有了这种关系,数据只能通过一种方式。

本地主机 --> 127.0.0.1 <--本地开发

在 Localhost 上监听和在 127.0.0.1 上监听不是一回事

我注意到,当我启动 Ruby on Rails 服务器时,日志指定服务器正在侦听 localhost:3000。在我的浏览器中,当我点击 localhost:3000 时,我会看到我正在构建的网站。

现在 localhost 默认指向 127.0.0.1,那么如果我转到 127.0.0.1:3000 会发生什么?答:没什么。Ruby 服务器没有说监听 127.0.0.1,而是 localhost。即使 localhost 最终到达 127.0.0.1,127.0.0.1 也不是服务器正在侦听的地址。

现在,如果服务器正在监听 127.0.0.1 并且您从浏览器中点击 localhost,您仍然会获得您的网站,因为 localhost 会将所有内容转发到 127.0.0.1。因此,如果您尝试访问另一个指向 127.0.0.1 的主机名(例如上一个示例中的 localdev),这也将起作用。

清理 10.0.2.2 和 Localhost 的关系

一旦我们了解了 localhost 和 127.0.0.1 之间的关系,我们就可以更好地理解来自 Android 的 10.0.2.2 和您机器上的 localhost 之间的关系。使用模拟器的 Android 文档说 10.0.2.2 链接到:

主机环回接口的特殊别名(即开发机器上的 127.0.0.1)

请注意,它指向的是 IP 地址,而不是主机名。如果我们让服务器在 127.0.0.1 而不是 localhost 上监听,模拟器将能够成功地向我们的服务器发送消息。

于 2015-08-29T17:31:05.143 回答