Java:HttpComponents从特定URL的输入流中获取垃圾响应

时间:2011-08-27 13:23:34

标签: java httprequest inputstream apache-httpcomponents

我目前正在尝试让HttpComponents发送HttpRequests并检索响应。 在大多数URL上,这没有问题,但是当我尝试获取phpBB论坛的URL http://www.forum.animenokami.com时,客户端需要更多时间,而responseEntity不止一次包含段落,导致html文件损坏。

例如,元标记包含六次。由于许多其他URL工作,我无法弄清楚我做错了什么。 页面在已知的浏览器中正常工作,因此它不是一个问题。

以下是我用来发送和接收的代码。

        URI uri1 = new URI("http://www.forum.animenokami.com");
    HttpGet get = new HttpGet(uri1);
    get.setHeader(new BasicHeader("User-Agent", "Mozilla/5.0 (Windows NT 5.1; rv:6.0) Gecko/20100101 Firefox/6.0"));
    HttpClient httpClient = new DefaultHttpClient();
    HttpResponse response = httpClient.execute(get);
    HttpEntity ent = response.getEntity();
    InputStream is = ent.getContent();
    BufferedInputStream bis = new BufferedInputStream(is);
    byte[] tmp = new byte[2048];
    int l;
    String ret = "";
    while ((l = bis.read(tmp)) != -1){
        ret += new String(tmp);
    }

我希望你能帮助我。 如果您需要更多信息,我会尽快提供。

2 个答案:

答案 0 :(得分:4)

此代码完全破解:

String ret = "";
while ((l = bis.read(tmp)) != -1){
    ret += new String(tmp);
}

三件事:

  • 无论读取了多少数据,这都是在每次迭代时将整个缓冲区转换为字符串。 (我怀疑这是你的情况实际上出了什么问题。)
  • 它使用默认的平台编码,这几乎不是一个好主意。
  • 它在循环中使用字符串连接,这会导致性能不佳。

幸运的是,您可以使用EntityUtils轻松避免所有这些:

String text = EntityUtils.toString(ent);

这将使用响应中指定的适当字符编码(如果有),否则使用ISO-8859-1。 (还有另一个重载,它允许您指定在未指定的情况下使用哪种字符编码。)

值得理解原始代码的错误,而不是只是用更好的代码替换它,这样你就不会在其他情况下犯同样的错误。

答案 1 :(得分:0)

  

它工作正常,但我不明白为什么我只在此网址上多次看到相同的文字。

这是因为您的客户端在读取套接字时看到更多不完整的缓冲区。可能是:

  • 因为从远程站点到客户端的路由存在网络带宽瓶颈,
  • 因为远程站点正在进行一些不必要的刷新,或者
  • 其他一些原因。

关键是您的客户端必须密切关注read调用读入缓冲区的字节数,否则最终会插入垃圾邮件。特别是网络流不容易填充缓冲区。