HTTP传输
HTTP协议 (超文本传输协议)
-
用途 : 网页获取,数据的传输
-
特点
- 应用层协议,传输层使用tcp传输
- 简单,灵活,很多语言都有HTTP专门接口
- 无状态,协议不记录传输内容
- http1.1 支持持久连接,丰富了请求类型
- 网页请求过程
1.客户端(浏览器)通过tcp传输,发送http请求给服务端
2.服务端接收到http请求后进行解析
3.服务端处理请求内容,组织响应内容
4.服务端将响应内容以http响应格式发送给浏览器
5.浏览器接收到响应内容,解析展示

HTTP请求(request)
| GET / HTTP/1.1 |
| 请求类别 请求内容 协议版本 |
| |
请求类别:每个请求类别表示要做不同的事情
| GET : 获取网络资源 |
| POST :提交一定的信息,得到反馈 |
| HEAD : 只获取网络资源的响应头 |
| PUT : 更新服务器资源 |
| DELETE : 删除服务器资源 |
| CONNECT |
| TRACE : 测试 |
| OPTIONS : 获取服务器性能信息 |
http响应(response)
- 响应格式:响应行,响应头,空行,响应体
| HTTP/1.1 200 OK |
| 版本信息 响应码 附加信息 |
响应码 :
| 1xx 提示信息,表示请求被接收 |
| 2xx 响应成功 |
| 3xx 响应需要进一步操作,重定向 |
| 4xx 客户端错误 |
| 5xx 服务器错误 |
🔧 一个简单的网页服务器
| """ |
| 注意在 linux 系统下运行 |
| IO多路复用 , http训练 |
| """ |
| |
| from socket import * |
| from select import select |
| |
| |
| |
| |
| class HTTPServer: |
| def __init__(self, host='0.0.0.0', port=80, dir=None): |
| self.host = host |
| self.port = port |
| self.dir = dir |
| self.address = (host, port) |
| |
| self.rlist = [] |
| self.wlist = [] |
| self.xlist = [] |
| |
| self.create_socket() |
| self.bind() |
| |
| |
| def create_socket(self): |
| self.sockfd = socket() |
| self.sockfd.setsockopt(SOL_SOCKET, |
| SO_REUSEADDR, 1) |
| |
| |
| def bind(self): |
| self.sockfd.bind(self.address) |
| |
| |
| def serve_forever(self): |
| self.sockfd.listen(3) |
| print("Listen the port %d" % self.port) |
| |
| self.rlist.append(self.sockfd) |
| while True: |
| rs, wx, xs = select(self.rlist, |
| self.wlist, |
| self.xlist) |
| for r in rs: |
| |
| if r is self.sockfd: |
| c, addr = r.accept() |
| self.rlist.append(c) |
| else: |
| |
| self.handle(r) |
| |
| |
| def handle(self, connfd): |
| |
| request = connfd.recv(4096) |
| |
| |
| if not request: |
| self.rlist.remove(connfd) |
| connfd.close() |
| return |
| |
| |
| request_line = request.splitlines()[0] |
| info = request_line.decode().split(' ')[1] |
| print(connfd.getpeername(), '请求内容:', info) |
| |
| |
| |
| if info == '/' or info[-5:] == '.html': |
| self.get_html(connfd, info) |
| else: |
| self.get_data(connfd, info) |
| |
| |
| def get_html(self, connfd, info): |
| if info == '/': |
| |
| filename = self.dir + '/index.html' |
| else: |
| filename = self.dir + info |
| try: |
| fd = open(filename) |
| except Exception: |
| |
| response = "HTTP/1.1 404 Not Found\r\n" |
| response += "Content-Type:text/html\r\n" |
| response += '\r\n' |
| response += "<h1>Sorry....</h1>" |
| else: |
| response = "HTTP/1.1 200 OK\r\n" |
| response += "Content-Type:text/html\r\n" |
| response += '\r\n' |
| response += fd.read() |
| finally: |
| |
| connfd.send(response.encode()) |
| |
| |
| def get_data(self, connfd, info): |
| f = open(self.dir + "/timg.jpg", 'rb') |
| data = f.read() |
| response = "HTTP/1.1 200 OK\r\n" |
| response += "Content-Type:image/jpeg\r\n" |
| response += '\r\n' |
| response = response.encode() + data |
| connfd.send(response) |
| |
| |
| |
| if __name__ == '__main__': |
| """ |
| 通过HTTPServer快速启动服务,用于展示自己的网页 |
| """ |
| |
| HOST = '0.0.0.0' |
| PORT = 8000 |
| DIR = "./static" |
| |
| httpd = HTTPServer(HOST, PORT, DIR) |
| httpd.serve_forever() |
| |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)