import socket #创建一个socket对象 sk = socket.socket() #绑定ip和端口 sk.bind(("127.0.0.1", 8050)) #监听 sk.listen() #等待连接 while True: conn,addr=sk.accept() #接收数据 data = conn.recv(1024) #打印接收的数据 print(data) #发送数据 conn.send(b"ok") #断开连接 conn.close()
Host: 127.0.0.1:8050
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8\
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
b''
以上为请求头
1.客户端连接到web服务端
一个http客户端,通常是浏览器,与web服务器的http端口(默认为80)建立一个tcp套接字连接.列如,
2.发送HTTP请求
通过tcp套接字,客户端向web服务器发送一个文本的请求报文,一个请求报文有请求行,请求头部,空行和请求数据4部分组成
3.服务器接收请求并返回HTTP响应
web服务器解析请求,定位请求资源,服务器将资源副本写到tcp套接字,由客户端读取,一个响应由状态行,响应头部,空行和响应数据4部分组成
4.释放连接tcp连接
若connection模式为close,则服务器主动关闭tcp连接,客户端被动连接',释放tcp连接connection模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接受请求
5.客户端浏览器解析HTML内容
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码,然后解析每一个响应头,响应头告知一下为若干字节的HTML文档和文档的字符集,客户端浏览器读取响应数据HTML,根据HTML的语法对齐进行格式化,并在浏览器窗口中显示
在浏览器地址栏键入URL,接下回车之后会经历以下流程:
1.浏览器向DNS服务器请求解析该URL中的域名所对应的IP地址:
2.解析出ip地址后,根据该IP地址和默认端口80,和服务器建立TCP连接
HTTP状态码
状态代码的第一个数字代表当前响应的类型:
1. 1xx消息---请求已被服务器接收,继续处理
2. 2xx消息----请求已成功被服务器接收,处理,并接受
3. 3xx重定向-----需要后续操作才 能完成这一请求'
4. 4xx请求错误-----------请求含有词法错误或者无法被执行
5. 5xx服务器错误------服务器在处理某个正确请求时发生错误
100-199 用于指定客户端应相应的某些动作。
200-299 用于表示请求成功。
300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息。
400-499 用于指出客户端的错误。
500-599 用于支持服务器错误。
URL
超文本传输协议(HTTP)的统一资源定位符将从因特网获取信息的五个基本元素包括在一个简单的地址中:
*传送协议
*层级URL标记符号(为[//]固定不变)
*访问资源需要的凭证信息(可省略)
*服务器.(通常为域名,有时为IP地址)
*端口号(以数字方式表示,若为http的默认值'80可省略')
*路径.(以'/'字符区别路径中的每一个目录名称)
*查询.(get模式的窗体参数,以"?"字符为起点,每个参数以shift键+数字7键隔开,再以"="分开参数名称与数据,通常以utf-8的URL编码,避开字符冲突的问题)
*片段 以#号键字符为起点
列子http://www.luffycity.com:80/news/index.html?id=250&page=1
其中http是协议
www.luffycity.com是服务器
80,是服务器上的网络端口号
/news/index.html是路径
?id=250&page=1是查询