【问题标题】:URL.openConnection() returns already-open connection the second timeURL.openConnection() 第二次返回已经打开的连接
【发布时间】:2012-09-27 00:03:13
【问题描述】:

我正在使用 Scala 开发网站抓取应用程序。我正在抓取的网站主要面向会话,因此我必须访问该网站一次以获取会话 ID,然后才能执行其他任何操作。

我得到这样的连接来检索会话 ID:

url.openConnection().asInstanceOf[HttpURLConnection]

它工作正常。返回的 HttpURLConnection 的 .connected 字段为假,当我对其调用 .connect() 时,它变为真。没问题。

当我完成连接并在其上调用 .disconnect() 时,会出现第一个问题。 .connected 字段保持不变。嗯。

所以现在我已经获得了我的会话 ID,并且我去获取具有我想要的表单的页面。我打电话

url.openConnection().asInstanceOf[HttpURLConnection]

再一次,就像上次一样——实际上是相同的代码——除了这次它给我的 HttpURLConnection 将 .connected 字段设置为 true!一开始我以为它给了我之前给我的同一个对象,但不,内存ID不同。

当然,现在当我在连接上调用 .setRequestProperty() 时,它会出现 IllegalStateException: Already connected。

我是否误解了如何使用 HttpURLConnection?

注释:Scala 2.9.2,Java 6.0。另外,我调用 .openConnection() 的 URL 对象是不同的对象,不一样。

谢谢...

【问题讨论】:

  • 我也有同样的问题。奇怪的是,它似乎发生在某些虚拟机上而不是其他虚拟机上——我还没有发现一种模式。你找到解决办法了吗?

标签: java scala httpurlconnection


【解决方案1】:

它被称为连接池,以寻求 HTTP Keep-alive。很好。你想要它。如果你真的不知道,请调用disconnect() 方法。

【讨论】:

  • am 调用 .disconnect():见原帖。它使 .connected 字段奇怪地不受干扰。
  • 我不反对我的 HttpURLConnections 被池化:我只想能够在它们上设置请求参数,而不仅仅是第一次连接时。
  • @DanWiebe 如果这还不起作用,我会感到惊讶,这是一个非常基本的使用模式。
【解决方案2】:

根据我的经验,URL 类不太适合基于会话的工作(尤其是基于 cookie 的会话)。

如果你想利用这一点,我建议使用Apache HTTPClient之类的东西

恕我直言

【讨论】:

  • 会话不是基于 cookie,而是基于参数。如果可以的话,我想保持这个相当轻量级。我所做的很简单,我宁愿不要像 HTTPClient 这样的重炮。
  • 是的,不用担心,这只是一个建议:)
  • 我不同意这个评论。 URLConnection 在重定向时处理 cookie 不正确,但在其他方面工作正常。我已经用它做了很多工作(例如bigbeeconsultants.co.uk/bee-client)并发现了这一点。 Apache API 可能是抓取工具的不错选择,但前提是您对其强加的线程池感到满意。
  • @Rick-777 很高兴知道,我一直无法让它工作,一定是做错了什么
【解决方案3】:

听起来 HttpUrlConnection 在幕后是 keeping the connection alive

查看at this article 以获取一些提示,以强制其关闭连接并且不要过度提供帮助。

尽管在您的情况下听起来您可能想要使用 keep-alive,因为它可以通过避免不必要的连接握手来加快您对网站的调用。

【讨论】:

  • 感谢您的回复!我试过了:.setRequestProperty(“连接”,“关闭”)。但是没有用:同样的东西。不过,我很感激你的建议。
  • 您是否还关闭了您正在阅读的连接中的任何流?
  • 是的,当然可以,但感谢您的检查。在任何情况下,您都要求一个新的 HttpURLConnection 并得到一个已经连接的,这似乎是不可原谅的。我想不出任何可以接受的情况。
猜你喜欢
  • 2016-02-17
  • 1970-01-01
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多