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

问题描述:

我试图针对远程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

您是否使用持续性URLConnection/HttpURLConnection?如果连接已被服务器关闭,您可能会收到null

如果您使用的是持久连接,服务器可能没有足够的时间做出响应。

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

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