1. 返回固定页面的http服务器
首先我们知道http协议是基于tcp协议的,所以我们只要使用套接字返回固定格式的字符串就可以在浏览器上显示
?1 import socket ?2 ??3 ??4 def service_client(client_socket): ?5 ????# 接收客户端的请求 ?6 ????recv_msg = client_socket.recv(1024) ?7 ??8 ????# 获取请求头的第一行并打印 ?9 ????request_header = recv_msg.decode() ?6 ????recv_msg = client_socket.recv(1024) ?7 ??8 ????# 获取请求头的第一行并打印 ?9 ????request_header = recv_msg.decode() 10 ????request_url = request_header.splitlines()[0] 11 ????print("-"*50) 12 ????print("\033[31m" + request_url + "\033[0m") 13 ?14 ????# 拼接固定字符串 15 ????response = "HTTP/1.1 200 ok\r\n" 16 ????response += "\r\n" 17 ????response += "<h1>hello world</h1>" 18 ?19 ????# 将响应的字符串发送给浏览器端并关闭套接字 20 ????client_socket.send(response.encode()) 21 ????client_socket.close() 22 ?23 ?24 def main(): 25 ????# 创建socket套接字 26 ????http_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 27 ????http_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 28 ????# 绑定地址 29 ????http_server_socket.bind(("192.168.219.177", 8080)) 30 ?31 ????# 使套接字变为被动监听状态 32 ????http_server_socket.listen(128) 33 ?34 ????# 等待客户端连接 35 ????while True: 36 ????????client_socket, client_addr = http_server_socket.accept() 37 ?38 ????????service_client(client_socket) 39 ?40 ????# 关闭监听套接字 41 ????http_server_socket.close() 42 ?43 ?44 if __name__ == "__main__": 45 ????main()
浏览器显示效果:
当我们完成一个简单的返回固定页面的http服务器后。我们就可以根据浏览器请求的url显示出固定的页面。实现一个静态http服务器。
?2 import re ?3 ??4 ??5 def service_client(client_socket): ?6 ????# 接收客户端的请求 ?7 ????recv_msg = client_socket.recv(1024) ?8 ??9 ????request_header = recv_msg.decode() 10 ????request_url = request_header.splitlines()[0] 11 ????print("-"*50) 12 ????print("\033[31m" + request_url + "\033[0m") 13 ?14 ????# 默认显示index页面 ?15 ????file_name = "/index.html" 16 ?17 ????# 匹配出请求头的第一行 ?18 ????file_re_obj = re.match("[^/]+(/[^ ]+)", request_url) 19 ?20 ????# 如果匹配到url中的文件名,将其赋值给file_name 21 ????if file_re_obj: 22 ?????????file_name = file_re_obj.group(1) 23 ?24 ????try: 25 ????????# 以二进制的格式打开templates文件夹中的静态文件 26 ????????with open("templates" + file_name, "rb") as f: 27 ????????????data = f.read() 28 ????except: 29 ????????# 如果没有文件夹中没有用户所需要的页面,返回404 30 ????????response = "HTTP/1.1 404 NOT FOUND\r\n" 31 ????????response += "\r\n" 32 ????????response += "<h1>404 NOT FOUND</h1>" 33 ????????client_socket.send(response.encode()) 34 ????else: 35 ????????# 拼接响应头 36 ????????response = "HTTP/1.1 200 ok\r\n" 37 ????????response += "\r\n" 38 ????????# 拼接byte类型的响应头和响应体并返回 39 ????????client_socket.send(response.encode()+data) 40 ?41 ????# 关闭套接字 42 ????client_socket.close() 43 ?44 ?45 def main(): 46 ????# 创建socket套接字 47 ????http_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 48 ????http_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 49 ????# 绑定地址 50 ????http_server_socket.bind(("192.168.219.177", 8080)) 51 ?52 ????# 使套接字变为被动监听状态 53 ????http_server_socket.listen(128) 54 ?55 ????# 等待客户端连接 56 ????while True: 57 ????????client_socket, client_addr = http_server_socket.accept() 58 ?59 ????????service_client(client_socket) 60 ?61 ?62 ????http_server_socket.close() 63 ?64 ?65 if __name__ == "__main__": 66 ????main()
http服务器
原文地址:https://www.cnblogs.com/colden/p/9771022.html