2011-12-15 31 views
1

まで、私は指定されたURLでWebページを読み込むプログラムを開発することになっています待ちますが、問題は、私はTCPだけを使用させていただいております、私は任意のHTTPライブラリを使用することは許されないのですということです。以下JavaのHTTP GET応答がタイムアウト

応答メッセージを読み取るコードである:

private static String readMultiline (BufferedReader inStr) { 
    String message=""; 
    String line=readLine(inStr); 

    while (line != null) { 
     message += line + "\r\n"; 
     line=readLine(inStr); 
    } 

    if (message.length() == 0) return null; 
     return message; 
} 

private static String readLine (BufferedReader inStr) { 
    String line = null; 
    try{ 
     line = inStr.readLine(); 
    } catch (IOException ioe) { 
     System.out.println("ERROR: Incoming packet could not be read properly."); 
     return null; 
    } 
    return line; 
} 

問題は、ヘッダと、ウェブページのコンテンツが完全に受信されることであるが、whileループは依然として「次の」行を待つ、これ存在しない。しばらくすると、タイムアウトが発生し、コードが続行されます。私が接続しようとしているサーバは "Connection:close"をしません。ファイルの最後をどのように検出できますか?

+1

この宿題はありますか?なぜあなたはJava SDKに含まれているHTTPライブラリを使用できないのですか? – Perception

+0

はい、宿題です。私が見る限り、HTTPライブラリーはストリームからの読み込みとほぼ同じように動作しますが、ファイルの終わりを検出できない限り、問題が発生します。 – kubuzetto

答えて

3

他の回答は削除されました。あなたは、行が改行文字で終了した文字の集合として定義された状態で、ライン情報のを読むIOメソッドを使用しています。しかし、あなたのTCPパケットが改行で終わるという保証はないので、それらを処理するためには、より無関係なIO読み取りを使用する必要があります。

は、それは私はあなたが非常に参考になると思いreadFullyと呼ばれる便利なメソッドを持って、DataInputStreamのを見てみましょう。

+0

うわー私はreadFully()について知らなかった、それはまさに私が探していたものです。ありがとうたくさん:D – kubuzetto

0

は、HTTPプロトコルをよく読んで。長さの情報を探します。私は1つまでを掲載しますので、

+0

ありがとうございます、私はヘッダーを解析し、readLine()の代わりにBufferedReader.read()を使用しようとします。 – kubuzetto

0

後半の答えのために申し訳ありません。

同じ問題を抱えている可能性のある人は、に「Connection:close」行を追加することも忘れていました。私が追加したとき、タイムアウトの問題は消えました。この関数とread()/ readFully()関数を使用して、問題を解決することができました。誰も助けることを願っています。

関連する問題