【发布时间】: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() 似乎可以清除连接...我只是不确定这样做会产生什么影响。