Java HTTP GET响应等待,直到超时
我应该开发一个程序,用指定的URL读取网页,但问题是我不允许使用任何HTTP库,我只允许使用TCP。Java HTTP GET响应等待,直到超时
下面是读取响应消息中的代码:
private static String readMultiline (BufferedReader inStr) {
String message="";
String line=readLine(inStr);
while (line != null) {
message += line + "\r\n";
line=readLine(inStr);
}
if (message.length() == 0) return null;
return message;
}
private static String readLine (BufferedReader inStr) {
String line = null;
try{
line = inStr.readLine();
} catch (IOException ioe) {
System.out.println("ERROR: Incoming packet could not be read properly.");
return null;
}
return line;
}
的问题是,头部和网页内容被完全接收,但是while循环仍然等待“下一个”线,这不存在。过了一段时间,超时发生,代码继续。我试图连接的服务器不会执行“连接:关闭”。我如何检测文件的结尾?
其他答案已删除,所以我会发布一个。您正在使用读取信息的行的IO方法,其中一行被定义为由换行符终止的一组字符。但是不能保证你的TCP数据包以换行符结束,所以你需要使用更多的不可知的IO读来处理它们。
看看DataInputStream,它有一个简便的方法,称为readFully
,我认为你会发现很有帮助。
在HTTP协议上阅读。寻找长度信息。
谢谢,我将尝试解析头文件,并使用BufferedReader.read()而不是readLine()。 – kubuzetto 2011-12-15 22:25:05
对于最近的答案感到抱歉。
对于任何可能遭遇同样问题的人,我也忘记了将“连接:关闭”行添加到请求本身。当我添加它时,超时问题消失了。有了这个和read()/ readFully()函数,我设法解决了这个问题。希望它能帮助任何人。
这是功课吗?为什么你会被禁止使用Java SDK中包含的HTTP库? – Perception 2011-12-15 22:14:06
是的,这是一个家庭作业。尽管如此,就我所见,HTTP库在从流中读取时的工作方式几乎相同。只要它无法检测到文件的结尾,问题就会发生。 – kubuzetto 2011-12-15 22:15:43