目录
@
*
我们可以这样理解:所有的==Web应用本质上就是一个socket服务端==,而用户的==浏览器就是一个socket客服端==。**
这样我们就可以自己实现Web框架了:
from socket import * sk = socket(AF_INET, SOCK_STREAM) sk.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) sk.bind(('127.0.0.1', 8080)) sk.listen() while True: conn, addr = sk.accept() data = conn.recv(9000) conn.send(b'HTTP/1.1 200 OK\r\n\r\n') # 响应状态行 conn.send(b'Hello,world!') conn.close()可以说Web服务本质上都是在这十几行代码基础上扩展出来的,这段代码就是它们的祖宗。
用户的浏览器一输入网址,会给服务端发送数据,那浏览器会发送什么数据?怎么发?这个谁来定? 你这个网站是这个规定,他那个网站按照他那个规定,这互联网还能玩么?
所以,必须有一个统一的规则,让大家发送消息、接收消息的时候有个格式依据,不能随便写。
这个规则就是HTTP协议,以后浏览器发送请求信息也好,服务器回复响应信息也罢,都要按照这个规则来。
HTTP协议主要规定了客户端和服务器之间的通信格式,那HTTP协议是怎么规定消息格式的呢?
让我们首先打印下我们在服务端接收到的消息是什么:
from socket import * sk = socket(AF_INET, SOCK_STREAM) sk.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) sk.bind(('127.0.0.1', 8080)) sk.listen() while True: conn, addr = sk.accept() data = conn.recv(9000) print(data) # 将浏览器发来的消息打印出来 conn.send(b'HTTP/1.1 200 OK\r\n\r\n') conn.send(b'Hello,world!') conn.close()输出如下:
b'GET / HTTP/1.1\r\nHost: 127.0.0.1:8080\r\nConnection: keep-alive\r\nPragma: no-cache\r\nCache-Control: no-cache\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8\r\nAccept-Encoding: gzip, deflate, br\r\nAccept-Language: zh-CN,zh;q=0.9,en;q=0.8\r\n\r\n'
然后我们再看一个我们访问博客官网时浏览器收到的响应信息是什么,响应的相关信息可以在浏览器调试窗口的network标签页中看到:
我们发现收发的消息需要按照一定的格式来,这里就需要了解一下HTTP协议了。
每个HTTP请求和响应都遵循相同的格式,一个HTTP包含Header和Body两部分,其中Body是可选的。HTTP响应的Header中有一个==Content-Type==表明响应的内容格式。如==text/html==表示HTML网页.
HTTP GET请求的格式:
HTTP响应的格式:
****
根据不同的路径返回不同的内容
普通版
==思路:从请求相关数据里面拿到请求URL的路径,然后拿路径做一个判断.==
from socket import * sk = socket(AF_INET, SOCK_STREAM) sk.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) sk.bind(('127.0.0.1', 8080)) sk.listen() while True: conn, addr = sk.accept() data = conn.recv(8096) # 把收到的字节类型的数据转换成字符串 data_str = str(da
