在while循环中运行时间(非常慢)

时间:2016-10-05 15:27:16

标签: python sockets

以下是我的代码:

import socket
import time
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect(('www.py4inf.com', 80))
mysock.send(b'GET /code/romeo.txt HTTP/1.1\n')
mysock.send(b'Host: www.py4inf.com\n\n')
all = b""

while True:
    data = mysock.recv(512)
    all = all + data
    if len(data) < 1:
        break

mysock.close()

stuff = all.decode()
position = stuff.find('\r\n\r\n')
print(stuff[position+4:])

必定有错误,因为在while循环中调用break会花费将近30秒。 但是,如果我将代码if len(data) < 1:更改为if len(data) < 100:,则只需0.5秒。

请帮忙。它困扰了我一段时间。 示例网站:http://www.py4inf.com/code/romeo.txt

1 个答案:

答案 0 :(得分:0)

Web服务器不必立即关闭连接。事实上,他们可能正在寻找另一个http请求。只需在recv之后添加print(data),您就会看到获取数据,然后暂停,然后b'',这意味着服务器最终关闭了套接字。

您还会注意到服务器发送的标题包含“Content-Length:167 \ r \ n”。标头完成后,服务器将发送正好167字节的数据。您可以自己解析标题,但这就是我们拥有urllibrequests等客户端库的原因。

我很想知道需要在请求标头中添加多少才能立即关闭连接,Connection: close似乎就这样做了。这会立即返回:

import socket
import time
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect(('www.py4inf.com', 80))
mysock.send(b'GET /code/romeo.txt HTTP/1.1\n')
mysock.send(b'Connection: close\n')
mysock.send(b'Host: www.py4inf.com\n\n')
all = b""

while True:
    data = mysock.recv(512)
    all = all + data
    if len(data) < 1:
        break

mysock.close()

stuff = all.decode()
position = stuff.find('\r\n\r\n')
print(stuff[position+4:])