为什么这个程序挂起?

2021-04-12 00:48:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我粘贴了整个代码,因为我认为它是尽可能短的

import socket

def recv_all(sock):
    parts = []
    while True:
        msg = ""
        msg = sock.recv(4096)
        print "recieved", len(msg), "bytes."
        if not msg:
            break
        parts.append(msg)
    return "".join(parts)

http_request = """GET / HTTP/1.1
Host: {}
User-Agent: Opera/9.80 (Windows NT 6.1; WOW64; U; tr) Presto/2.10.229 Version/11.64
Accept: text/html, application/xml;q=0.9, application/xhtml xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: en
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
Connection: Keep-Alive, TE
TE: deflate, gzip, chunked, identity, trailers


"""
site = "www.google.com.tr"
print "creating connection"
conn = socket.create_connection((site,80))
print "sending data"
conn.sendall(http_request.format(site))
print "recieving response"
response = recv_all(conn)
print "closing connection"
conn.close()

print response

当我运行这个,我得到这个输出

^{pr2}$

我希望它在读取最后一个块(在本例中是1648)之后读取0个字节。但它却一直在等待。在

我使用的是Windows7和Python2.7。在

我做错什么了?我该怎么做才能使它按预期工作?在

3条回答
网友
1楼 ·

密钥在您发送的HTTP请求中。请看这一行:

Connection: Keep-Alive, TE

这将告诉另一端的服务器保持连接活动。在

尝试:

Connection: Close

看看会发生什么。在

网友
2楼 ·

您正在发送:

Connection: Keep-Alive, TE

。。。而且服务器完全按照你的要求做了——在最后保持连接。所以你的read调用阻塞,等待更多的数据-而服务器正在等待同一连接上的另一个请求。在

要么关闭keep-alive或者寻找一个内容长度的标题,当你读了那么多数据后停止阅读。在

(或者,使用HTTP客户机库,而不是自己动手做:)

网友
3楼 ·

编辑:我误读了你的问题。虽然这不会导致挂起行为,但我认为您打算将最后一个msg添加到parts,这不会在最后一次运行中发生,因为您的if ... break语句在.append之前。在

相关问题