我正在尝试针对远程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
答案 0 :(得分:0)
您使用的是持久性URLConnection
/ HttpURLConnection
吗?
如果服务器已关闭连接,您可能会收到null
。
如果使用持久连接,服务器可能没有时间响应。
This可能会更好地描述问题。查看doHttpUrlConnectionAction(String desiredUrl)
中给出的超时。你可能会找到答案。
如果这是您的问题,您可以尝试以0.1秒的间隔进行多次读取,例如...... 1-5秒。这是为了确保您快速获得响应,而不必等待完整超时以确保服务器已响应。