2012-03-22 13 views
1

リモートHTTPサーバーに対して単純なHTTP/1.1クライアントアプリケーションを実装しようとしています。サーバーからの応答が301 Moved Permanentlyの場合、サーバーの応答で指定された新しい場所からファイルをダウンロードしようとします。最初にGETメッセージをサーバーに送信し、移動先のファイルが見つかった新しいURLを取得できました。Javaを使用するHTTP/1.1クライアントでサーバーが同時要求に応答しない

問題は、ファイルの新しい場所でクライアントからのGET要求を送信すると、サーバーがnullを返すという問題です。クライアントメッセージの書き込みやサーバーの応答の読み込みに何か問題があるかどうかは不明です。ここで私のコードは、任意のヘルプが評価されています。

else if(serverMessage.equals("HTTP/1.1 301 Moved Permanently")) 
{ 
    System.out.println(" A new permanent URL is assigned to the file " + fileName); 
    serverMessage=""; 
    lineCount=0; 
    while((serverMessage = reader.readLine()) != null) 
    {   
     lineCount++; 
     System.out.println("reply: " + serverMessage); 
     if(serverMessage.indexOf("Location") >= 0) 
     { 
       for(int x=serverMessage.indexOf("Location")+10; x<serverMessage.length(); x++) 
       { 
         newURL= newURL + serverMessage.charAt(x); 
       } 
      } 

     } 
    System.out.println("newURL : " + newURL); 
    host = findHost(newURL); 

    path = findPath(newURL); 

    fileName=findFileName(newURL);     

    clientMessage = "GET "; 
    clientMessage = clientMessage + path; 
    clientMessage = clientMessage + " HTTP/1.1\r\nHost: "; 
    clientMessage = clientMessage + host; 
    clientMessage = clientMessage + "\r\n\r\n"; 

    System.out.println("client message: \"" + clientMessage +"\""); 

    writer.newLine(); 
    writer.write(clientMessage); 
    writer.flush(); 

    serverMessage = reader.readLine(); 
    System.out.println("reply2: " + serverMessage); //returns null!!! 

    while((serverMessage=reader.readLine())!=null) 
    { 
      System.out.println("reply2: " + serverMessage); 
    } 

} 

EDIT:クライアント・メッセージの変数は、以下の(彼らはすべての既存のファイルのためにテストされ、正常に動作 - 正常にダウンロード!)です

NEWURL:http://wlab.cs.bilkent.edu.tr/~cs421/pa1/302-redirect-success.txt
ホスト2:wlab.cs.bilkent。 edu.tr
パス2:/~cs421/pa1/302-redirect-success.txt
FILENAME2:302-リダイレクトsuccess.txt

+0

clientMessage変数に何が含まれているかをお知らせください。 –

答えて

0

永続的なものを使用していますURLConnection/HttpURLConnection

接続がサーバーによって閉じられている場合、nullが表示される場合があります。

永続的な接続を使用している場合、サーバーは応答する時間がなかった可能性があります。

Thisは、問題を少し詳しく説明している場合があります。 doHttpUrlConnectionAction(String desiredUrl)で与えられたタイムアウトをチェックしてください。答えが見つかるかもしれません。

これが問題であれば、0.1秒間隔で複数回読み取ることができます.1〜5秒です。これは、応答が速くなるように、サーバーが応答したことを確認するために完全なタイムアウトを待つ必要がないようにするためです。

関連する問題