0

我想查看我的 android 应用程序在发出 Web 请求时发送的确切标头,所以我想我只需在本地机器上用 java 创建一个简单的服务器应用程序,然后让我的 android 应用程序调用它。然后只需将请求转储到控制台,这样我就可以看到应用程序正在发送什么。但是,当我尝试连接时,应用程序挂起并停止响应。

我创建了一个简单的服务器,它只接受一个连接并系统输出它获得的数据。服务器运行良好,如果我从计算机上的网络浏览器点击它,将打印来自网络浏览器请求的标头。所以我知道服务器工作正常。

这是我的应用程序中的代码:

URL url = new URL("http://192.168.1.11:9000");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.connect();

PrintWriter writer = new PrintWriter(connection.getOuputStream(), true);
writer.write("hi");
writer.close();

简单的。毕竟我只想要标题。现在我开始没有帖子并使用:

URL url = new URL("http://192.168.1.11:9000");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();

BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
in.close();

但这不起作用。应用程序停止响应 getInputStream() 请求。它只是停止,不会继续。服务器也没有收到连接请求。

所以总而言之,应用程序阻塞了 url 连接的 getInputStream,我不知道为什么。

现在我搜索了一段时间,发现了这些:

Android 应用程序通过套接字与服务器通信

套接字异常套接字未连接android

Android嵌入式浏览器无法连接到局域网上的服务器

使用 java.net.URLConnection 触发和处理 HTTP 请求

客户端 Socket 无法连接到正在运行的 Socket 服务器

但没有任何帮助。我没有像每个有这个问题的人一样使用本地主机,我已经尝试使用 androids 10.0.0.2 但这也不起作用。

我不在一个限制任何东西的网络上(我在家),我尝试使用显示的第一组代码向我的服务器发送消息,但即使这样也不起作用(它运行良好,但服务器从不得到一个客户。那是如何工作的?)。

我尝试同时使用 URLConnection 和 HttpURLConnection,它们都有同样的问题。

我也在我的应用程序中使用互联网权限,因此它确实具有所需的权限。

我在这一点上不知所措。为什么我不能对我的服务器进行简单的调用?

编辑

我使用了 androids 文档中的确切代码:

private String downloadUrl(String myurl) throws IOException {
    InputStream is = null;
    // Only display the first 500 characters of the retrieved
    // web page content.
    int len = 500;

    try {
        URL url = new URL("http://10.0.2.2:9000");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setReadTimeout(10000 /* milliseconds */);
        conn.setConnectTimeout(15000 /* milliseconds */);
        conn.setRequestMethod("GET");
        conn.setDoInput(true);
        // Starts the query
        conn.connect();
        int response = conn.getResponseCode();
        is = conn.getInputStream();

        // Convert the InputStream into a string
        String contentAsString = readIt(is, len);
        return contentAsString;

        // Makes sure that the InputStream is closed after the app is
        // finished using it.
    } finally {
        if (is != null) {
            is.close();
        }
    }
}

但即使这样也行不通。它仍然挂起。只是现在它挂在 getResponseCode() 上。然后抛出超时异常。服务器永远不会收到请求。

4

3 回答 3

0

您的地址必须以“http://”开头,请重试!

于 2013-07-31T00:50:04.570 回答
0

我有一个用于发出 HTTP GET 请求的 Java 类,我猜它与您使用的 android 代码几乎相同,所以下面我已经转储了代码的相关部分。我在 Java 应用程序(不是在 Android 上)中多次使用过这个类。

currentUrl = new URL(getUrl);
conn = (HttpURLConnection)currentUrl.openConnection();
conn.setRequestProperty("Cookie",  getCookies(currentUrl.getHost()));
conn.setRequestProperty("User-Agent", "robadob.org/crawler");
if(referrer!=null){conn.setRequestProperty("Referrer",referrer);}
conn.setRequestMethod("GET");
conn.connect();
//Get response
String returnPage = "";
String line;
BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
while ((line = rd.readLine()) != null) {
    returnPage+=line+"\n";
}
rd.close();

我看不到任何明显会导致您的代码失败的东西,但希望您能从中发现一些东西。是setRequestProperty我设置标题,所以你不应该需要这些。

如果失败了,用 System.out 填充你的代码,这样你就可以看到它停在哪个语句上。

于 2013-07-31T17:57:36.647 回答
0

我认为您的问题的根源是 Android 在连接完成之前对您的应用程序进行了 FC,因为我假设您没有将其包装在 Loader、AsyncTask 或 Thread 中。我建议您遵循Google 提供的培训指南,将您的呼叫包装在 AsyncTask 中,看看是否可以解决问题。

于 2013-07-31T02:17:22.500 回答