【问题标题】:Reading Web Page 2nd Time Always Times out第二次阅读网页总是超时
【发布时间】:2018-07-11 16:01:13
【问题描述】:

我有以下方法来阅读网页:

public String readURL() {

    String response="";
    try {
        URL url=new URL(urlString);
        BufferedReader br=new BufferedReader(new InputStreamReader(url.openStream()));
        response=br.readLine();
        br.close();
    } catch (Exception e) {
        JOptionPane.showMessageDialog(null,"Unable to connect to server: "+e.toString(),windowTitle,JOptionPane.ERROR_MESSAGE);
        System.exit(-1);
    }
    return(response);
}

当我第一次调用这个方法时,它总是有效的。但是,当我第二次调用它时(在同一次运行中), InputStreamReader 超时。 urlString 两次都是一样的。我可以重新运行应用程序并且第一次调用成功。我可以在浏览器中连续多次使用该 urlString 并且它总是成功。似乎有些事情我没有关闭,或者我需要做一些清理工作。为了进行后续调用,缺少什么方法? TIA。

【问题讨论】:

  • 也许close 也会关闭System.in
  • 小问题:我会在 finally 块中 close(),或者更好的是,使用 try-with-resources

标签: java url inputstreamreader


【解决方案1】:

对我来说效果很好,我只是这样做了

System.out.println(readURL());
System.out.println(readURL());

这对我来说很好。我唯一能想到的是您可能需要关闭 InputStreamReader。 InputStream 不需要关闭,javadoc 说 InputStream.close() 什么都不做。

编辑:也许网站不喜欢被脚本快速连续调用两次(我不知道网站如何检测到这一点,但也许这是可能的)。尝试使用其他站点测试脚本。

【讨论】:

  • 无需关闭 InputStreamReader。 “你的代码对我有用”的答案并不是那么好,因为它表明问题出在其他地方,并且当前状态下的问题无法回答。
  • 我不是这类事情的专家,所以也许没有必要。使用“您的代码为我工作”确实意味着问题出在其他地方,但这并不会使答案变得糟糕。它鼓励提出问题的人在其他地方找到答案(比如我的编辑)。
  • 嗯。存在差异可能表明问题出在哪里。第一次调用是在“main”中完成的,并且返回某个响应会导致显示一个 JDialog。用户填写表单并单击提交按钮后,按钮侦听器是对该方法的第二次调用。在侦听器中进行网络处理是否有问题?
  • @WtRiker:您的问题对我们来说无法重现,您需要将其隔离在能够重现问题的最小代码中,minimal reproducible example,然后将其发布在您的问题中。否则任何人都可以做的就是猜测(正如我们在这里看到的那样)。
  • 我必须将我的主机放在 url 中,我不想在公共论坛上发布它。我可以发布 SSCCE 并通过 PM 提供网址吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多