0

現在、HttpComponents に HttpRequests を送信して Response を取得させようとしています。ほとんどの URL ではこれは問題なく動作しますが、phpBB フォーラムの URL、つまりhttp://www.forum.animenokami.comを取得しようとすると、クライアントの処理に時間がかかり、responseEntity に複数のパッセージが含まれているため、エラーが発生します。 html ファイル。

たとえば、メタ タグは 6 回含まれています。他の多くの 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);
    }

あなたが私を助けてくれることを願っています。さらに情報が必要な場合は、できるだけ早く提供できるように努めます。

4

2 に答える 2

4

このコードは完全に壊れています:

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

三つのこと:

  • これは、読み取られたデータの量に関係なく、反復ごとにバッファー全体を文字列に変換しています。(これがあなたのケースで実際に間違っていると思います。)
  • デフォルトのプラットフォーム エンコーディングを使用していますが、これは決して良い考えではありません。
  • ループ内で文字列連結を使用しているため、パフォーマンスが低下します。

幸いなことに、以下を使用して、これらすべてを非常に簡単に回避できますEntityUtils

String text = EntityUtils.toString(ent);

応答で指定された適切な文字エンコーディングがあればそれを使用し、それ以外の場合は ISO-8859-1 を使用します。(指定されていない場合に使用する文字エンコーディングを指定できる別のオーバーロードがあります。)

他の状況で同じ過ちを犯さないように、元のコードをより良いコードに置き換えるのではなく、元のコードの何が問題なのかを理解することは価値があります。

于 2011-08-27T13:25:54.537 に答える
0

正常に動作しますが、理解できないのは、この URL でのみ同じテキストが複数回表示される理由です。

これは、クライアントがソケットを読み取るときに、より多くの不完全なバッファが表示されるためです。次の可能性があります。

  • リモート サイトからクライアントへのルートにネットワーク帯域幅のボトルネックがあるため、
  • リモートサイトが不必要なフラッシュを行っているため、または
  • 他の理由。

ポイントは、クライアントは呼び出しによってバッファに読み込まれたバイト数に細心の注意を払う必要readがあるということです。そうしないと、ジャンクが挿入されてしまいます。特にネットワーク ストリームは、バッファがいっぱいにならない傾向があります。

于 2011-08-27T14:33:52.080 に答える