静态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. 获取执⾏python程序的终端命令⾏参数
2. 判断参数的类型,设置端⼝号必须是整型
3. 给Web服务器类的初始化⽅法添加⼀个端⼝号参数,⽤于绑定端⼝号
示例
import socket import threading import sys # 获取用户请求资源的路径 # 根据请求资源的路径,读取指定文件的数据 # 组装指定文件数据的响应报文,发送给浏览器 # 判断请求的文件在服务端不存在,组装404状态的响应报文,发送给浏览器 class HttpWebServer: def __init__(self, port): # 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(("", port)) # 设置监听 self.tcp_server_socekt.listen(128) def handle_client_request(self, client_socekt): # 获取浏览器的请求信息 client_request_data = client_socekt.recv(1024).decode() print(client_request_data) # 获取用户请求资源的路径 requst_data = client_request_data.split(" ") print(requst_data) # 判断客户端是否关闭 if len(requst_data) == 1: client_socekt.close() return # 求资源的路径 request_path = requst_data[1] if request_path == "/": request_path = "/index.html" # 3.读取固定页面数据,把页面数据组装成HTTP响应报文数据发送给浏览器 # 根据请求资源的路径,读取指定文件的数据 try: with open("./static" + request_path, "rb") as f: file_data = f.read() except Exception as e: # 返回404错误数据 # 应答行 response_line = "HTTP/1.1 404 Not Found\r\n" # 应答头 response_header = "Server:pwb\r\n" # 应答体 response_body = "404 Not Found sorry" # 应答数据 # 组装指定文件数据的响应报文,发送给浏览器 response_data = (response_line + response_header + "\r\n" + response_body).encode() client_socekt.send(response_data) else: # 应答行 response_line = "HTTP/1.1 200 OK\r\n" # 应答头 response_header = "Server:pwb\r\n" # 应答体 response_body = file_data # 应答数据 # 组装指定文件数据的响应报文,发送给浏览器 response_data = (response_line + response_header + "\r\n").encode() + response_body client_socekt.send(response_data) finally: # 4.HTTP响应报文数据发送完成以后,关闭服务于客户端的套接字 client_socekt.close() 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() def main(): # 获取执行python程序的终端命令行参数 print(sys.argv) # ['.\\05_静态Web服务器_命令行启动动态绑定端口号.py', '9090'] if len(sys.argv) != 2: print("格式错误 python3 xxx.py 9090") return # 判断参数的类型,设置端口号必须是整型 if not sys.argv[1].isdigit(): print("格式错误 python3 xxx.py 9090") return port = int(sys.argv[1]) # 创建服务器对象 # 给Web服务器类的初始化方法添加一个端口号参数,用于绑定端口号 my_web_server = HttpWebServer(port) # 启动服务器 my_web_server.start() if __name__ == '__main__': main()
总结
1. 获取执⾏python程序的终端命令⾏参数
1 | sys.argv |
2. 判断参数的类型,设置端⼝号必须是整型
if len(sys.argv) != 2: print("格式错误 python3 xxx.py 9090") return # 判断参数的类型,设置端口号必须是整型 if not sys.argv[1].isdigit(): print("格式错误 python3 xxx.py 9090") return port = int(sys.argv[1])
3. 给Web服务器类的初始化⽅法添加⼀个端⼝号参数,⽤于绑定端⼝号
1 2 3 4 5 6 7 8 9 10 | def __init__( self , port): # 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(("", port)) # 设置监听 self .tcp_server_socekt.listen( 128 ) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律