【问题标题】:Python HTTPSConnection.close() does not appear to close the connection?Python HTTPSConnection.close() 似乎没有关闭连接?
【发布时间】:2010-04-02 17:01:43
【问题描述】:

我不确定这是错误还是我做错了什么。如果我要进行这样的 HTTP 连接:

import httplib

http_connection = httplib.HTTPConnection("192.168.192.196")
http_connection.request("GET", "/")
http_connection.sock.settimeout(20)
response = http_connection.getresponse()
data = response.read()
http_connection.close()

然后在 DOS 提示符下,我这样做:

netstat -ano | find /i "192.168.192.196:80" | find /i "ESTABLISHED"

我什么也得不到。

但是,如果我做同样的事情,但将其更改为 HTTPSConnection:

import httplib

http_connection = httplib.HTTPSConnection("192.168.192.196")
http_connection.request("GET", "/")
http_connection.sock.settimeout(20)
response = http_connection.getresponse()
data = response.read()
http_connection.close()

然后这样做:

netstat -ano | find /i "192.168.192.196:443" | find /i "ESTABLISHED"

我实际上会看到连接保持建立,直到我真正 ^Z 退出 Python shell。

这发生在我负责的一个应用程序中。 Python 实际上并没有挂在那里——它只是让连接保持打开状态。

我在这里做错了吗?我需要额外的代码来关闭 HTTPS 连接吗?

这是 Python 2.6.4,顺便说一句。

【问题讨论】:

  • 当我尝试这个(在 Windows XP 上使用 Python 2.6.4)时,我看到连接进入 CLOSE_WAIT 并最终消失。你的服务器有什么奇怪的吗?
  • 这很奇怪。如果您删除连接 (del http_connection) 并运行垃圾收集器,则连接将关闭。它也适用于 Python 3.1,可能是因为 GC 行为发生了变化,也可能不是......
  • Dave Bacher:不,我不认为服务器在做任何奇怪的事情。我也在标准的 HTTPS Web 服务器上尝试过这个,它做同样的事情。 AndiDog:运行 gc.collect() 似乎可以清除连接...我只是不确定这样做会产生什么影响。

标签: python https


【解决方案1】:

事实证明,如果您发送“Connection: close”HTTP 标头,这不是问题 - 尽管我仍然认为 .close() 实际上应该像 HTTPConnection 一样关闭连接。

【讨论】:

    猜你喜欢
    • 2020-11-17
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    相关资源
    最近更新 更多