【Python高级编程035 ● 静态web服务器 ● 静态Web服务器-返回指定页面数据】
---------Python基础编程---------
Author : AI菌
【内容讲解】
一、需求 根据用户的请求返回指定页面的数据 二、实现步骤 1、获取用户请求资源的路径 2、根据请求资源的路径,读取指定文件的数据 3、组装指定文件数据的响应报文,发送给浏览器 4、判断请求的文件在服务端不存在,组装404状态的响应报文,发送给浏览器 三、需要考虑的问题 1、客户端建立连接后没有发送任何数据就下线的情况 2、判断请求的是否是根目录,如果是根目录设置返回的信息 3、打开文件,读取文件中的数据, 使用rb模式,兼容打开图片文件
【代码演示】
""" 一、需求 根据用户的请求返回指定页面的数据 二、实现步骤 1、获取用户请求资源的路径 2、根据请求资源的路径,读取指定文件的数据 3、组装指定文件数据的响应报文,发送给浏览器 4、判断请求的文件在服务端不存在,组装404状态的响应报文,发送给浏览器 三、需要考虑的问题 1、客户端建立连接后没有发送任何数据就下线的情况 2、判断请求的是否是根目录,如果是根目录设置返回的信息 3、打开文件,读取文件中的数据, 使用rb模式,兼容打开图片文件 """ import socket def main(): # 创建tcp服务端套接字 tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 设置端口号复用, 程序退出端口立即释放 tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True) # 绑定端口号 tcp_server_socket.bind(("", 8000)) # 设置监听 tcp_server_socket.listen(128) # 循环响应客户端请求 while True: # 等待接受客户端的连接请求 new_socket, port = tcp_server_socket.accept() # 代码执行到此,说明连接建立成功 # 接收客户端的数据,对二进制数据进行解码 recv_client_data = new_socket.recv(4096) # 判断接收的客户端数据是否为0 if len(recv_client_data) == 0: new_socket.close() return # 对二进制数据进行解码 recv_client_content = recv_client_data.decode("utf-8") print("来自客户端的数据:", recv_client_content) # 对数据按照空格进行分割,分割2次 request_list = recv_client_content.split(" ", maxsplit=2) # 获取请求资源的路径 request_path = request_list[1] print(request_path) # 判断请求的是否是根目录,如果是根目录设置返回的信息 if request_path == "/": request_path = "/index.html" # 读取文件数据 # rb表示以二进制的方式读取文件数据,图片数据需要以二进制格式打开,使用rb with open("static" + request_path, "rb") as file: file_data = file.read() # 响应行 response_line = "HTTP/1.1 200 OK\r\n" # 响应头 response_header = "server:DiamondDownload1.0\r\n" # 响应体 response_body = file_data # 拼接响应报文 response_data = (response_line + response_header + "\r\n").encode("utf-8") + response_body # 发送数据 new_socket.send(response_data) # 关闭服务端与客户端套接字 new_socket.close() if __name__ == '__main__': main()
【运行结果】
服务端程序控制台打印结果:
来自客户端的数据: GET /grand.html HTTP/1.1 Host: 192.168.1.64:8000 Connection: keep-alive Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 截取的请求资源的路径: /grand.html 来自客户端的数据: GET /js/jquery-1.12.4.min.js HTTP/1.1 Host: 192.168.1.64:8000 Connection: keep-alive User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36 Accept: */* Referer: http://192.168.1.64:8000/grand.html Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 截取的请求资源的路径: /js/jquery-1.12.4.min.js 来自客户端的数据: GET /images/001.jpg HTTP/1.1 Host: 192.168.1.64:8000 Connection: keep-alive User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36 Accept: image/avif,image/webp,image/apng,image/*,*/*;q=0.8 Referer: http://192.168.1.64:8000/grand.html Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 截取的请求资源的路径: /images/001.jpg 来自客户端的数据: GET /images/002.jpg HTTP/1.1 Host: 192.168.1.64:8000 Connection: keep-alive User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36 Accept: image/avif,image/webp,image/apng,image/*,*/*;q=0.8 Referer: http://192.168.1.64:8000/grand.html Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 截取的请求资源的路径: /images/002.jpg 来自客户端的数据: GET /images/003.jpg HTTP/1.1 Host: 192.168.1.64:8000 Connection: keep-alive User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36 Accept: image/avif,image/webp,image/apng,image/*,*/*;q=0.8 Referer: http://192.168.1.64:8000/grand.html Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 截取的请求资源的路径: /images/003.jpg 来自客户端的数据: GET /images/004.jpg HTTP/1.1 Host: 192.168.1.64:8000 Connection: keep-alive User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36 Accept: image/avif,image/webp,image/apng,image/*,*/*;q=0.8 Referer: http://192.168.1.64:8000/grand.html Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 截取的请求资源的路径: /images/004.jpg 来自客户端的数据: GET /images/005.jpg HTTP/1.1 Host: 192.168.1.64:8000 Connection: keep-alive User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36 Accept: image/avif,image/webp,image/apng,image/*,*/*;q=0.8 Referer: http://192.168.1.64:8000/grand.html Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 截取的请求资源的路径: /images/005.jpg 来自客户端的数据: GET /favicon.ico HTTP/1.1 Host: 192.168.1.64:8000 Connection: keep-alive Pragma: no-cache Cache-Control: no-cache User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36 Accept: image/avif,image/webp,image/apng,image/*,*/*;q=0.8 Referer: http://192.168.1.64:8000/grand.html Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 截取的请求资源的路径: /favicon.ico
浏览器访问:
【往期精彩】
▷【Python基础编程196 ● 读取文件的4种方式】
▷【Python基础编程197 ● 读取文件的4种方式】
▷【Python基础编程198 ● 读取文件的4种方式】
▷【Python基础编程199 ● Python怎么读/写很大的文件】
▷【Python基础编程200 ● 读取文件的4种方式】
▷【Python基础编程201 ● 读取文件的4种方式】
▷【Python基础编程202 ● 读取文件的4种方式】
▷【Python基础编程203 ● 读取文件的4种方式】
【加群交流】