服务器不响应使用Java的HTTP / 1.1客户端中的并发请求

时间:2012-03-22 11:00:09

标签: java client-server http-1.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);
     }

}

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

newURL:http://wlab.cs.bilkent.edu.tr/~cs421/pa1/302-redirect-success.txt
host2:wlab.cs.bilkent.edu.tr
path2:/~cs421/pa1/302-redirect-success.txt
fileName2:302-redirect-success.txt

1 个答案:

答案 0 :(得分:0)

您使用的是持久性URLConnection / HttpURLConnection吗?

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

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

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

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