1

我正在粘贴整个代码,因为我认为它尽可能短;

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

当我运行它时,我得到了这个输出;

创建连接
发送数据
收到回复
收到 3743 个字节。
收到 4096 字节。
收到 4096 字节。
收到 4096 字节。
收到 3472 字节。
收到 1648 个字节。

我期望它做的是在读取最后一个块(在本例中为 1648)后读取 0 个字节。但它一直在等待。

我在带有 Python 2.7 的 Windows 7 上。

我在这里做错了什么?我应该怎么做才能按预期工作?

4

3 回答 3

5

您正在发送:

Connection: Keep-Alive, TE

...并且服务器完全按照您的要求进行操作 - 最后保持连接处于活动状态。因此,您的读取调用阻塞,等待更多数据 - 而服务器正在等待同一连接上的另一个请求。

关闭keep -alive查找 Content-Length 标头,并在您读取那么多数据时停止读取。

(或者,使用 HTTP 客户端库而不是尝试自己做 :)

于 2012-08-22T19:34:33.577 回答
1

关键在于您发送的 HTTP 请求。看到这一行:

连接:保活,TE

这告诉另一端的服务器保持连接处于活动状态。

尝试:

连接:关闭

看看会发生什么。

于 2012-08-22T19:36:31.193 回答
0

编辑:我误读了你的问题。虽然这不会导致您的挂起行为,但我认为您打算将最后一个添加msgparts,这不会在最终运行时发生,因为您的if ... break语句位于.append.

于 2012-08-22T19:41:43.037 回答