【问题标题】:Java HTTP GET response waits until timeoutJava HTTP GET 响应等到超时
【发布时间】:2012-01-21 13:46:32
【问题描述】:

我应该开发一个程序来读取具有指定 URL 的网页,但问题是我不能使用任何 HTTP 库,我只能使用 TCP。

下面是读取响应消息的代码:

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;
}

问题是header和web页面内容都被完全接收了,但是while循环还在等待'next'行,不存在。过了一会儿,发生超时,代码继续。我尝试连接的服务器不执行“连接:关闭”。如何检测文件的结尾?

【问题讨论】:

  • 这是作业吗?为什么会禁止您使用 Java SDK 中包含的 HTTP 库?
  • 是的,这是一个家庭作业。尽管据我所知,HTTP 库在从流中读取时的工作方式几乎相同。只要它无法检测到文件的结尾,就会出现问题。

标签: java http tcp timeout


【解决方案1】:

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

看看 DataInputStream,它有一个名为readFully 的便捷方法,我认为您会发现它很有帮助。

【讨论】:

  • 哇,我不知道 readFully(),这正是我想要的。非常感谢:D
【解决方案2】:

阅读 HTTP 协议。查找长度信息。

【讨论】:

  • 谢谢,我会尝试解析头部并使用 BufferedReader.read() 而不是 readLine()。
【解决方案3】:

抱歉回复晚了。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-30
    • 1970-01-01
    • 2017-03-24
    • 2021-08-28
    相关资源
    最近更新 更多