2012-03-22 108 views
1

我試圖針對遠程HTTP服務器實現簡單的HTTP/1.1客戶端應用程序。如果我有一個來自服務器的響應301 Moved Permanently,我會嘗試從服務器響應中給出的新位置下載文件。我能夠將第一個GET消息發送到服務器,並檢索我詢問的文件被移動的新URL。服務器不響應HTTP/1.1客戶端中的併發請求使用Java

問題是,當我發送第二個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); 
    } 

} 

編輯:(!他們都正常工作,對現有文件進行測試 - 成功下載)客戶端消息的變量是如下

的newURL:http://wlab.cs.bilkent.edu.tr/~cs421/pa1/302-redirect-success.txt
主機2:wlab.cs.bilkent。 edu.tr
PATH2:/~cs421/pa1/302-redirect-success.txt
文件名2:302重定向-success.txt

+0

您可以請發佈clientMessage變量包含什麼? – 2012-03-22 11:04:37

回答

0

您是否使用持續性URLConnection/HttpURLConnection?如果連接已被服務器關閉,您可能會收到null

如果您使用的是持久連接,服務器可能沒有足夠的時間做出響應。

This可能會更好地描述問題。查看doHttpUrlConnectionAction(String desiredUrl)中給出的超時時間。你可能會在那裏找到答案。

如果這是您的問題,您可以嘗試以0.1秒的間隔進行多次讀取,例如...... 1-5秒。這是爲了確保您快速獲得響應,並且不必等待完全超時以確保服務器已作出響應。

相關問題