以下是我的代码:
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
答案 0 :(得分:0)
Web服务器不必立即关闭连接。事实上,他们可能正在寻找另一个http请求。只需在recv之后添加print(data)
,您就会看到获取数据,然后暂停,然后b''
,这意味着服务器最终关闭了套接字。
您还会注意到服务器发送的标题包含“Content-Length:167 \ r \ n”。标头完成后,服务器将发送正好167字节的数据。您可以自己解析标题,但这就是我们拥有urllib
和requests
等客户端库的原因。
我很想知道需要在请求标头中添加多少才能立即关闭连接,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:])