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

Java:HttpComponents从特定URL的输入流获取垃圾响应,java,httprequest,inputstream,apache-httpcomponents,Java,Httprequest,Inputstream,Apache Httpcomponents,我目前正在尝试让HttpComponents发送HttpRequests并检索响应。 在大多数URL上,这是没有问题的,但是当我尝试获取phpBB论坛的URL时,即客户端需要更多的时间,并且响应包含多次段落,从而导致html文件损坏 例如,元标记包含六次。由于许多其他URL都可以工作,我无法找出我做错了什么。 该页面在已知的浏览器中工作正常,因此这对他们来说不是问题 这是我用来发送和接收的代码 URI uri1 = new URI("http://www.forum.animen

我目前正在尝试让HttpComponents发送HttpRequests并检索响应。 在大多数URL上,这是没有问题的,但是当我尝试获取phpBB论坛的URL时,即客户端需要更多的时间,并且响应包含多次段落,从而导致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);
    }
我希望你能帮助我。
如果您需要更多信息,我将尽快提供。

此代码已完全中断:

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

  • 这是在每次迭代时将整个缓冲区转换为字符串,而不管读取了多少数据。(我怀疑这就是你的问题所在。)
  • 它使用默认的平台编码,这几乎不是一个好主意
  • 它在循环中使用字符串连接,这会导致性能不佳
幸运的是,您可以使用以下方法轻松避免所有这些问题:

将使用响应中指定的适当字符编码(如果有),或ISO-8859-1中指定的其他字符编码。(还有另一个重载,允许您指定未指定的字符编码。)


但是,了解您的原始代码有什么问题是值得的,而不仅仅是用更好的代码替换它,这样您就不会在其他情况下犯同样的错误。

此代码完全被破坏了:

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

  • 这是在每次迭代时将整个缓冲区转换为字符串,而不管读取了多少数据。(我怀疑这就是你的问题所在。)
  • 它使用默认的平台编码,这几乎不是一个好主意
  • 它在循环中使用字符串连接,这会导致性能不佳
幸运的是,您可以使用以下方法轻松避免所有这些问题:

将使用响应中指定的适当字符编码(如果有),或ISO-8859-1中指定的其他字符编码。(还有另一个重载,允许您指定未指定的字符编码。)

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

它工作得很好,但我不明白的是,为什么我只在这个URL上多次看到相同的文本

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

  • 因为从远程站点到客户端的路由上存在网络带宽瓶颈
  • 因为远程站点正在进行一些不必要的刷新,或者
  • 还有其他原因
关键是您的客户机必须密切关注
read
调用读入缓冲区的字节数,否则它将插入垃圾。网络流尤其容易不填充缓冲区

它工作得很好,但我不明白的是,为什么我只在这个URL上多次看到相同的文本

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

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

关键是您的客户机必须密切关注
read
调用读入缓冲区的字节数,否则它将插入垃圾。特别是网络流很容易不填满缓冲区。

很好,谢谢。它工作得很好,但我不明白的是,为什么我只在这个URL上多次看到相同的文本。我对其他URL没有这个问题。每次转换整个缓冲区时,应该只有最后一个字节有问题,因为剩下的字节不到2048个,对吗?缓冲区中的内容也将在每次迭代中被替换,这样就不会导致输出重复。非常感谢。它工作得很好,但我不明白的是,为什么我只在这个URL上多次看到相同的文本。我对其他URL没有这个问题。每次转换整个缓冲区时,应该只有最后一个字节有问题,因为剩下的字节不到2048个,对吗?缓冲区中的内容也将在每次迭代中被替换,这样就不会导致输出重复。