我对此感到困惑,所以我想我应该问一下,以防你们中的任何人遇到它,因为HttpClient开发有点像一门艺术。
我面临的问题是:一个应用程序正在使用Apache库与同一公司网络中的服务器进行通信。大多数情况下,它可以正常工作,但有时我们会看到由于响应不完整而导致的大量异常:它们都缺少结束标记的最后三个字符,所以客户端中的解析器会抱怨。这可能会持续5到10分钟,然后就会消失。
我无法在本地复制这个问题,并且我已经验证了响应完全是由服务器编写的。客户端使用PostMethod的getResponseBodyAsStream()方法获取响应内容,但它只被调用一次。也许它需要循环调用这个方法,直到它在响应被缓冲的极少数情况下得到null?
我将非常感谢您的任何意见。
编辑:服务器正在写入content-length报头并正确刷新,而在客户端,数据通过以下命令读入字符串:
//method is a PostMethod, client is a HttpClient
client.executeMethod(hostconfig, method);
InputStream is = method.getResponseBodyAsStream();
String response = null;
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
int len;
while ((len = is.read(buf)) > 0) {
bos.write(buf, 0, len);
}
response = new String(bos.toByteArray(), "UTF-8");
} ... // closing try block
发布于 2009-07-31 20:34:11
来自服务器的content-length报头是否设置正确?我不能百分之百确定Commons-HttpClient是否尊重这些,但它很容易做到。我想不出有什么理由需要反复调用getResponseBodyAsStream。
同样可以想象的是,您用于读取流的代码正在进行错误的假设。也许我们可以看到你如何读取数据的片段,以确保你实际上正确地读取了整个流?一些常见的编码错误可能会导致仅读取高达缓冲量的内容(这将导致看似随机的失败)。
除此之外,很难说...我们经常使用Commons HttpClient,没有类似的症状。
发布于 2009-10-30 08:58:29
我也一直面临着这个问题。只有在将URL从本地主机更改为公共URL之后,才会出现此问题。
我找到了几个解决方案。
我找到的第一个“解决方案”是在开始读取过程之前执行一个Thread.sleep(1000)。我认为这会导致缓冲区在尝试读取之前被填满。(我知道这是没有意义的,因为read()声明它阻塞,直到数据可用,但不幸的是,read方法有时认为它比预期更早地到达了末尾)。这更像是一块丑陋的补丁所以我一直在找。
第二个选择,也是最好的选择是使用BufferedReader中的readLine()方法。此方法正确地实现了读取过程。我还没有读过readLine的源代码,但我认为我们可以在那里找到问题的解决方案。
欢迎光临。
https://stackoverflow.com/questions/1214707
复制相似问题