1

我正在尝试针对远程 HTTP 服务器实现一个简单的 HTTP/1.1 客户端应用程序。如果我有301 Moved Permanently来自服务器的响应,我将尝试从服务器响应中给出的新位置下载文件。我能够将第一GET条消息发送到服务器并检索我询问的文件被移动到的新 URL。

问题是,当我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);
     }
                        
}

编辑:客户端消息的变量如下(它们都正常工作,针对现有文件进行了测试 - 成功下载!)

新网址: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
文件名2:302-redirect-success.txt

4

1 回答 1

0

你在使用持久化URLConnection/HttpURLConnection吗?

null如果连接已被服务器关闭,您可能会收到。

如果您使用持久连接,则服务器可能没有时间响应。

可能会更好地描述问题。查看中给出的超时doHttpUrlConnectionAction(String desiredUrl)。你可能会在那里找到答案。

如果这是您的问题,您可以尝试以 0.1 秒的间隔进行多次读取,例如 ... 1-5 秒。这是为了确保您快速获得响应,而不必等待完全超时以确保服务器已响应。

于 2012-03-22T12:17:53.910 回答