首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Apache HttpClient 3.0.1的间歇性不完整响应

使用Apache HttpClient 3.0.1的间歇性不完整响应
EN

Stack Overflow用户
提问于 2009-07-31 20:27:23
回答 2查看 2.2K关注 0票数 3

我对此感到困惑,所以我想我应该问一下,以防你们中的任何人遇到它,因为HttpClient开发有点像一门艺术。

我面临的问题是:一个应用程序正在使用Apache库与同一公司网络中的服务器进行通信。大多数情况下,它可以正常工作,但有时我们会看到由于响应不完整而导致的大量异常:它们都缺少结束标记的最后三个字符,所以客户端中的解析器会抱怨。这可能会持续5到10分钟,然后就会消失。

我无法在本地复制这个问题,并且我已经验证了响应完全是由服务器编写的。客户端使用PostMethod的getResponseBodyAsStream()方法获取响应内容,但它只被调用一次。也许它需要循环调用这个方法,直到它在响应被缓冲的极少数情况下得到null?

我将非常感谢您的任何意见。

编辑:服务器正在写入content-length报头并正确刷新,而在客户端,数据通过以下命令读入字符串:

代码语言:javascript
运行
复制
//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
EN

回答 2

Stack Overflow用户

发布于 2009-07-31 20:34:11

来自服务器的content-length报头是否设置正确?我不能百分之百确定Commons-HttpClient是否尊重这些,但它很容易做到。我想不出有什么理由需要反复调用getResponseBodyAsStream。

同样可以想象的是,您用于读取流的代码正在进行错误的假设。也许我们可以看到你如何读取数据的片段,以确保你实际上正确地读取了整个流?一些常见的编码错误可能会导致仅读取高达缓冲量的内容(这将导致看似随机的失败)。

除此之外,很难说...我们经常使用Commons HttpClient,没有类似的症状。

票数 1
EN

Stack Overflow用户

发布于 2009-10-30 08:58:29

我也一直面临着这个问题。只有在将URL从本地主机更改为公共URL之后,才会出现此问题。

我找到了几个解决方案。

我找到的第一个“解决方案”是在开始读取过程之前执行一个Thread.sleep(1000)。我认为这会导致缓冲区在尝试读取之前被填满。(我知道这是没有意义的,因为read()声明它阻塞,直到数据可用,但不幸的是,read方法有时认为它比预期更早地到达了末尾)。这更像是一块丑陋的补丁所以我一直在找。

第二个选择,也是最好的选择是使用BufferedReader中的readLine()方法。此方法正确地实现了读取过程。我还没有读过readLine的源代码,但我认为我们可以在那里找到问题的解决方案。

欢迎光临。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1214707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档