• python自带静态web服务器搭建代码实现(一)


    一、静态web服务

    静态web法服务器:可为发出请求的浏览器提供静态文档的程序,平时上网浏览的页面都是动态的,而开发的是静态的,页面数据不会发生变化

    搭建python自带的静态web服务器

    • 命令:python3 -m http.server 端口号
      • -m:表示运行包里面的模块,执行该命令需进入指定静态文件目录,通过浏览器就能访问对应html文件
      • 端口号若不指定则默认为8000

    浏览器访问搭建的静态web服务器及其通信过程

    二、静态Web服务器-返回固定页面数据 

    静态Web服务器实现步骤

    1. 编写TCP服务端程序
    2. 获取浏览器发送的http请求报文数据
    3. 读取固定数据,将页面数据组装为http响应报文数据发送给浏览器
    4. http响应报文数据发送完后,关闭服务于客户端的套接字

    实现代码 

    1. import socket
    2. if __name__ == '__main__':
    3. server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建TCP服务端套接字
    4. server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True) # 设置端口号复用,程序退出端口立即释放
    5. server_socket.bind(('', 9000)) # 绑定端口号
    6. server_socket.listen(128) # 设置监听
    7. while True: # 循环接受客户端的连接请求
    8. comm_socket, ip_port = server_socket.accept() # 等待接受客户端的连接请求
    9. recv_data = comm_socket.recv(4096) # 获取浏览器发送的http请求报文数据
    10. print('接收到的数据解码后为:', recv_data.decode('utf-8'))
    11. with open('C:/Users/username/Desktop/ubuntu/file1/1.txt', 'rb') as file:
    12. file_data = file.read() # 读取文件数据
    13. response_line = "HTTP/1.1 200 OK !!!\r\n" # 响应行
    14. response_header = "Server: PWS1.0 # 服务器名称及版本\r\n" # 响应头
    15. response_body = file_data # 响应体
    16. response_data = (response_line + response_header + '\r\n').encode('utf-8') + response_body # 将数据组装成HTTP响应报文数据发送给浏览器
    17. comm_socket.send(response_data) # 发送响应报文数据至浏览器
    18. comm_socket.close() # 关闭服务于客户端的套接字

    输出如下

    1. 浏览器刷新后输出:
    2. 接收到的数据解码后为: GET /file1/1.txt HTTP/1.1
    3. Host: 127.0.0.1:9000
    4. Connection: keep-alive
    5. Cache-Control: max-age=0
    6. sec-ch-ua: "Google Chrome";v="105", "Not)A;Brand";v="8", "Chromium";v="105"
    7. sec-ch-ua-mobile: ?0
    8. sec-ch-ua-platform: "Windows"
    9. Upgrade-Insecure-Requests: 1
    10. User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36
    11. 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
    12. Sec-Fetch-Site: none
    13. Sec-Fetch-Mode: navigate
    14. Sec-Fetch-User: ?1
    15. Sec-Fetch-Dest: document
    16. Accept-Encoding: gzip, deflate, br
    17. Accept-Language: zh-CN,zh;q=0.9
    18. Cookie: csrftoken=1wb7v0r0BQuokJCxRS4JAO2XApvrHXFP90t2PiYb0mz7AwWS0NoKTi0zNaIjOfTl; Hm_lvt_18f619820855042bca58b32408f44de7=1658219884
    19. If-Modified-Since: Sat, 15 Oct 2022 02:36:31 GMT

    浏览器响应如下 

    三、静态Web服务器-返回指定页面数据

    实现步骤

    1. 获取用户请求资源路径
    2. 根据路径读取指定文件数据
    3. 将指定文件数据组装为响应报文,发送给浏览器
    4. 判断请求文件在服务端不存在,组装404状态响应报文,发送给浏览器

    代码实现

    1. import socket
    2. def main():
    3. server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建TCP服务端套接字
    4. server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True) # 设置端口号复用,程序退出端口立即释放
    5. server_socket.bind(("", 9000)) # 绑定端口号
    6. server_socket.listen(128) # 设置监听
    7. while True:
    8. comm_socket, ip_port = server_socket.accept() # 等待接收客户端连接请求
    9. recv_data = comm_socket.recv(4096) # 接收请求的二进制数据
    10. if len(recv_data) == 0 :
    11. print('未获取到请求数据!')
    12. comm_socket.close()
    13. return
    14. recv_content = recv_data.decode('utf-8') # 对二进制数据解码
    15. print('获取到的数据内容为:', recv_content)
    16. request_list = recv_content.split(" ", maxsplit=2) # 根据指定字符串进行分割,最大分割次数为2
    17. request_path = request_list[1] # 获取请求资源路径
    18. print('请求路径为:', request_path)
    19. if request_path == "/": # 判断请求的是否是根目录,若是则返回首页指定数据
    20. request_path = "/index.html"
    21. try:
    22. with open('C:/Users/username/Desktop/ubuntu' + request_path, 'rb') as file: # 动态打开指定文件
    23. file_data = file.read() # 读取指定文件数据
    24. except Exception as e: # 请求异常,资源不存在,返回指定404错误数据
    25. with open('C:/Users/username/Desktop/ubuntu/error.html', 'rb') as file: # 打开指定错误文件
    26. error_data = file.read() # 读取指定错误数据
    27. response_line = "HTTP/1.1 404 Not Found!!\r\n" # 响应行
    28. response_header = "Server: PWS1.0 服务器名称及版本……\r\n" # 响应头
    29. response_body = error_data # 响应体
    30. response_data = (response_line + response_header + '\r\n').encode('utf-8') + response_body # 拼接响应报文
    31. comm_socket.send(response_data) # 发送数据给浏览器
    32. else:
    33. response_line = "HTTP/1.1 200 OK # 成功!!\r\n"
    34. response_header = "Server: PWS1.0 # 服务器名称版本!\r\n"
    35. response_body = file_data
    36. response_data = (response_line + response_header + '\r\n').encode('utf-8') + response_body
    37. comm_socket.send(response_data)
    38. finally:
    39. comm_socket.close() # 关闭服务于客户端的套接字
    40. if __name__ == '__main__':
    41. main()

    输出如下

    1. 404错误输出:
    2. 获取到的数据内容为: GET /ab.txt HTTP/1.1
    3. Host: 127.0.0.1:9000
    4. Connection: keep-alive
    5. Cache-Control: max-age=0
    6. sec-ch-ua: "Google Chrome";v="105", "Not)A;Brand";v="8", "Chromium";v="105"
    7. sec-ch-ua-mobile: ?0
    8. sec-ch-ua-platform: "Windows"
    9. Upgrade-Insecure-Requests: 1
    10. User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36
    11. 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
    12. Sec-Fetch-Site: none
    13. Sec-Fetch-Mode: navigate
    14. Sec-Fetch-User: ?1
    15. Sec-Fetch-Dest: document
    16. Accept-Encoding: gzip, deflate, br
    17. Accept-Language: zh-CN,zh;q=0.9
    18. Cookie: csrftoken=1wb7v0r0BQuokJCxRS4JAO2XApvrHXFP90t2PiYb0mz7AwWS0NoKTi0zNaIjOfTl; Hm_lvt_18f619820855042bca58b32408f44de7=1658219884
    19. 请求路径为: /ab.txt
    20. 未获取到请求数据!
    21. 正确响应输出:
    22. 获取到的数据内容为: GET /index.html HTTP/1.1
    23. Host: 127.0.0.1:9000
    24. Connection: keep-alive
    25. ……
    26. …… # 中间部分同错误输出
    27. 请求路径为: /index.html
    28. 未获取到请求数据!

    错误响应

    正确响应

      学习导航:http://xqnav.top/

  • 相关阅读:
    NodeJs实战-待办列表(5)-使用MySQL存储待办事项
    vue pdf文件流 预览
    25个例子学会Pandas Groupby 操作
    十一月29号作业
    【JavaWeb】后端(MySQL+Mybatis)
    spring boot集成quartz
    Vue3路由——基本使用、动态路由、路由正则、重复参数、嵌套路由、编程式导航、命名路由、重定向、别名、路由模式与导航守卫
    【超详细,面向初学者】如何用Idea快速创建一个MyBatis项目?导入坐标-创建数据库-成功运行示例
    SpringMVC简介
    手把手教你从零开始腾讯云服务器部署(连接建站教程)
  • 原文地址:https://blog.csdn.net/qq_43874317/article/details/127401781