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()
b‘GET / HTTP/1.1
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连接
3.浏览器发出读取文件(URL中域名后面部分对应的文件)的HTTP请求,该请求报文作为TCP三次握手的第三个报文的数据发送给服务器
4.服务器对浏览器请求做出响应,并把对应的html文本发送给浏览器
5.释放TCP连接
6.浏览器将该html文本并显示内容
推荐用书HTTP权威指南
HTTP请求方法 方式8种
1.get:获取到一个页面
2.head
3.post:提交数据
4.put:向指定位置上传最新内容
5.delete:请求服务器删除request--url所标识的资源
6.trace:回复显示器收到的请求,主要用于测试或诊断
7.options:使服务器传回资源所支持的所有http请求方法,用""双引号来代替资源名称,向web服务器发送options请求,可以测试服务器功能是否正常运作
8.connect:http/1.1协议中预留给能够将连接改为管道方式的代理服务器,通常用于ssl加密服务器的连接(经由非加密的http代理服务器)
HTTP状态码
状态代码的第一个数字代表当前响应的类型:
1. 1xx消息---请求已被服务器接收,继续处理
2. 2xx消息----请求已成功被服务器接收,处理,并接受
3. 3xx重定向-----需要后续操作才 能完成这一请求‘
4. 4xx请求错误-----------请求含有词法错误或者无法被执行
5. 5xx服务器错误------服务器在处理某个正确请求时发生错误
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是查询
原文地址:https://www.cnblogs.com/liurenli/p/10269139.html