2011-12-15 63 views
1

我应该开发一个程序,用指定的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循环仍然等待“下一个”线,这不存在。过了一段时间,超时发生,代码继续。我试图连接的服务器不会执行“连接:关闭”。我如何检测文件的结尾?

+1

这是功课吗?为什么你会被禁止使用Java SDK中包含的HTTP库? – Perception 2011-12-15 22:14:06

+0

是的,这是一个家庭作业。尽管如此,就我所见,HTTP库在从流中读取时的工作方式几乎相同。只要它无法检测到文件的结尾,问题就会发生。 – kubuzetto 2011-12-15 22:15:43

回答

3

其他答案已删除,所以我会发布一个。您正在使用读取信息的的IO方法,其中一行被定义为由换行符终止的一组字符。但是不能保证你的TCP数据包以换行符结束,所以你需要使用更多的不可知的IO读来处理它们。

看看DataInputStream,它有一个简便的方法,称为readFully,我认为你会发现很有帮助。

0

在HTTP协议上阅读。寻找长度信息。

+0

谢谢,我将尝试解析头文件,并使用BufferedReader.read()而不是readLine()。 – kubuzetto 2011-12-15 22:25:05

0

对于最近的答案感到抱歉。

对于任何可能遭遇同样问题的人,我也忘记了将“连接:关闭”行添加到请求本身。当我添加它时,超时问题消失了。有了这个和read()/ readFully()函数,我设法解决了这个问题。希望它能帮助任何人。