URL.openConnection()第二次返回已打开的连接

时间:2012-09-27 00:03:13

标签: java scala httpurlconnection

我正在使用Scala中的网站抓取应用程序。我正在抓取的网站是面向会话的,因此我必须先访问网站一次以获取会话ID,然后我才能做其他事情。

我获得了检索会话ID的连接,如下所示:

url.openConnection().asInstanceOf[HttpURLConnection]

工作正常。返回的HttpURLConnection的.connected字段为false,当我调用.connect()时它会翻转为true。没问题。

当我完成连接并在其上调用.disconnect()时,会出现第一个故障提示。 .connected字段保持为真。 HM。

所以现在我有了会话ID,然后我去获取具有我想要的表单的页面。我打电话给

url.openConnection().asInstanceOf[HttpURLConnection]

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

当然,现在当我在连接上调用.setRequestProperty()时,它会因为IllegalStateException而爆炸:已经连接。

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

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

...谢谢

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

如果您想利用这一点,我建议您使用Apache HTTPClient

之类的内容

IMHO

答案 2 :(得分:0)

听起来HttpUrlConnection对你来说是keeping the connection alive

请查看at this article以获取强制关闭连接的一些提示,而不是过度帮助。

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