在下面的代码中,HTTP协议需要两个换行符,但为什么需要回车符呢?为什么我们不能直接加上两个"/n "然后发送请求?
import socket
mysock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
mysock.connect(("data.pr4e.org",80))
cmd = 'GET http://data.pr4e.org/romeo.txt HTTP/1.0\r\n\r\n'.encode() # here
mysock.send(cmd)
while True:
data = mysock.recv(512)
if len(data) > 0:
print(data.decode())
else :
break
mysock.close()
因为这就是 HTTP协议 被定义。更具体地说,HTTP 1.0定义了一个请求的 这样:
Request = Simple-Request | Full-Request
Full-Request = Request-Line
*( General-Header
| Request-Header
| Entity-Header )
CRLF
[ Entity-Body ]
Request-Line = Method SP Request-URI SP HTTP-Version CRLF
Full-Request
,这是任何HTTP 1.0兼容的客户端都应该使用的(简单请求是HTTP 0.9,已被废弃)需要有两个 CRLF
代币(其中一个是在 Request-Line
). A CRLF
令牌是两个字节 \r\n
. 因此,在你的例子中,字符串的结尾需要用 \r\n\r\n
.
这个设计选择在HTTP 1.1中得到了保留。
因为这就是HTTP协议的工作方式。
requeststatus行和头文件都必须以(也就是回车后的换行)结束。空行必须只由且没有其他空格组成。