1

我目前的问题与这个非常相似。

我有一个downloadFile(URL)函数可以创建一个新的 HttpURLConnection,打开它,读取它,返回结果。当我在同一个 URL 上多次调用此函数时,第二次几乎总是返回 -1 的响应代码(但不会抛出异常!!!)。

问题的最佳答案非常有帮助,但我试图理解一些事情。

那么,如果将 http.keepAlive 设置为 false 可以解决问题,那么它究竟表明了什么?服务器以违反 http 协议的方式响应?或者更有可能,我的代码在某种程度上违反了协议?痕迹会告诉我什么?我应该寻找什么?

这有什么关系:

您需要从错误流中读取所有内容。否则,它将混淆下一个连接,这就是 -1 的原因。

这是否意味着如果响应是某种类型的错误(这将是什么响应代码?),流必须被完全读取?此外,每次我尝试一个 http 请求时,我基本上都是在创建一个新连接,然后disconnect()在最后对其进行 ing。

但是,就我而言,我没有得到 401 或其他什么。它总是 200。但我的第二次连接几乎总是失败。这是否意味着我应该读取其他一些我没有读取的数据(以类似的方式必须完全读取错误流)?

请帮助阐明这一点?我觉得我缺少一些基本的 http 协议理解。

PS 如果我只是使用 Apache HttpClient,我是否不必处理所有这些协议细节?它会照顾我的一切吗?

4

2 回答 2

3

默认 HTTP URL 处理程序中对 keep-alive 的支持非常有问题。我们总是把它关掉。

如果您想保持活动状态,请使用带有池连接管理器的 Apache HttpClient。如果你不想改变你的代码,你可以得到另一个像这样的处理程序,

http://www.innovation.ch/java/HTTPClient/

如果你的第二个连接总是失败,那意味着你的服务器不支持keepalive。使用 Keepalive,HTTP 处理程序只是让连接保持打开状态(即使您调用断开连接)。如果不支持keep-alive,服务器将关闭连接,但处理程序在您对连接发出下一个请求之前不知道,因此第二个连接失败。

关于读取错误流,它仅适用于您收到非 200 响应的情况。

于 2010-05-08T04:24:37.153 回答
0

我想你可能在谈论这个 HttpURLConnection 错误,在 froyo 中修复:

http://code.google.com/p/android/issues/detail?id=2939

请参阅该错误以了解其他解决方法。如果这不是您遇到的错误,请在http://code.google.com/p/android/issues/entry使用可重复的测试用例提出错误。

于 2010-05-09T16:27:32.460 回答