我想查看我的 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,我不知道为什么。
现在我搜索了一段时间,发现了这些:
使用 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() 上。然后抛出超时异常。服务器永远不会收到请求。