静态Web服务器-以⾯向对象的模式开发
1.网络编程之IP地址&子网掩码2.端口&端口号3.Socket(套接字)4.socket模块中socket类5.socket加密传输6.socket加密传输&mysql应用7.Socket客户端实现8.Socket客户端与服务端9.TCP(Transmission Control Protocol)传输控制协议10.网络传输数据的编解码11.TCP客户端开发12.socket之send和recv原理剖析13.多任务版TCP服务端程序开发14.UDP15.http协议之网址16.http协议之简介17.http协议之请求报文18.http协议之响应报文19.搭建Python⾃带静态Web服务器20.自研静态Web服务器并返回固定⻚⾯数据21.静态web服务器-根据请求返回指定页面数据22.静态Web服务器-多任务版
23.静态Web服务器-以⾯向对象的模式开发
24.静态Web服务器-命令⾏启动并动态绑定端⼝号步骤
1. 把提供服务的Web服务器抽象成⼀个类(HTTPWebServer)
2. 提供Web服务器的初始化⽅法,在初始化⽅法⾥⾯创建socket对象
3. 提供⼀个启动Web服务器的⽅法,让Web服务器处理客户端请求操 作。
示例
1 import socket 2 import threading 3 4 # 获取用户请求资源的路径 5 # 根据请求资源的路径,读取指定文件的数据 6 # 组装指定文件数据的响应报文,发送给浏览器 7 # 判断请求的文件在服务端不存在,组装404状态的响应报文,发送给浏览器 8 class HttpWebServer: 9 def __init__(self): 10 # 1.编写一个TCP服务端程序 11 # 创建socekt 12 self.tcp_server_socekt = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 13 # 设置端口复用 14 self.tcp_server_socekt.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True) 15 # 绑定地址 16 self.tcp_server_socekt.bind(("", 8080)) 17 # 设置监听 18 self.tcp_server_socekt.listen(128) 19 20 def handle_client_request(self, client_socekt): 21 # 获取浏览器的请求信息 22 client_request_data = client_socekt.recv(1024).decode() 23 print(client_request_data) 24 # 获取用户请求资源的路径 25 requst_data = client_request_data.split(" ") 26 print(requst_data) 27 28 # 判断客户端是否关闭 29 if len(requst_data) == 1: 30 client_socekt.close() 31 return 32 # 求资源的路径 33 request_path = requst_data[1] 34 35 if request_path == "/": 36 request_path = "/index.html" 37 38 # 3.读取固定页面数据,把页面数据组装成HTTP响应报文数据发送给浏览器 39 # 根据请求资源的路径,读取指定文件的数据 40 try: 41 with open("./static" + request_path, "rb") as f: 42 file_data = f.read() 43 except Exception as e: 44 # 返回404错误数据 45 # 应答行 46 response_line = "HTTP/1.1 404 Not Found\r\n" 47 # 应答头 48 response_header = "Server:pwb\r\n" 49 # 应答体 50 response_body = "404 Not Found sorry" 51 # 应答数据 52 # 组装指定文件数据的响应报文,发送给浏览器 53 response_data = (response_line + response_header + "\r\n" + response_body).encode() 54 55 client_socekt.send(response_data) 56 else: 57 # 应答行 58 response_line = "HTTP/1.1 200 OK\r\n" 59 # 应答头 60 response_header = "Server:pwb\r\n" 61 # 应答体 62 response_body = file_data 63 # 应答数据 64 # 组装指定文件数据的响应报文,发送给浏览器 65 response_data = (response_line + response_header + "\r\n").encode() + response_body 66 67 client_socekt.send(response_data) 68 finally: 69 # 4.HTTP响应报文数据发送完成以后,关闭服务于客户端的套接字 70 client_socekt.close() 71 72 def start(self): 73 while True: 74 # 2.获取浏览器发送的HTTP请求报文数据 75 # 建立链接 76 client_socekt, client_addr = self.tcp_server_socekt.accept() 77 # 创建子线程 78 sub_thread = threading.Thread(target=self.handle_client_request, args=(client_socekt,)) 79 sub_thread.start() 80 81 82 if __name__ == '__main__': 83 # 创建服务器对象 84 my_web_server = HttpWebServer() 85 # 启动服务器 86 my_web_server.start()
总结
1. 把提供服务的Web服务器抽象成⼀个类(HTTPWebServer)
1 | 1. 把提供服务的Web服务器抽象成⼀个类(HTTPWebServer) |
2. 提供Web服务器的初始化⽅法,在初始化⽅法⾥⾯创建socket对象
1 2 3 4 5 6 7 8 9 10 | def __init__( self ): # 1.编写一个TCP服务端程序 # 创建socekt self .tcp_server_socekt = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 设置端口复用 self .tcp_server_socekt.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True ) # 绑定地址 self .tcp_server_socekt.bind(("", 8080 )) # 设置监听 self .tcp_server_socekt.listen( 128 ) |
3. 提供⼀个启动Web服务器的⽅法,让Web服务器处理客户端请求操 作。
1 2 3 4 5 6 7 8 | def start( self ): while True : # 2.获取浏览器发送的HTTP请求报文数据 # 建立链接 client_socekt, client_addr = self .tcp_server_socekt.accept() # 创建子线程 sub_thread = threading.Thread(target = self .handle_client_request, args = (client_socekt,)) sub_thread.start() |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律