• Python学习----静态web服务器


    开发静态web服务器

    开发步骤:
    1、编写一个TCP服务端程序
    2、获取浏览器发送的HTTP请求报文数据
    3、读取固定页面数据,把页面数据组装HTTP响应报文数据发送给浏览器
    4、HTTP响应报文数据发送完成之后,关闭服务于客户端的套接字

    import socket
    
    if __name__ == '__main__':
        # 1、编写一个TCP服务端程序
        tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        tcp_server_socket.bind(("", 8080))
        tcp_server_socket.listen(128)
    
        while True:
            # 2、获取浏览器发送的HTTP请求报文
            client_socket, client_addr = tcp_server_socket.accept()
            client_request_data = client_socket.recv(1024).decode()
            print(client_request_data)
    
            # 3、读取固定页面数据,把页面数据组装称HTTP响应报文数据发送给浏览器
            # rb r 读取数据,b读取二进制的方式读取文件
            with open("./index.html", "rb") as f:
                file_data = f.read()
            # 组装http响应报文
            response_line = "HTTP/1.1 200 OK \n"
            response_header = "Server:pwb\n"
            response_body = file_data
            response_data = (response_line + response_header + "\n").encode() + response_body
            client_socket.send(response_data)
            client_socket.close()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    和之前服务端编写差不多,差别在于,首先客户端不需要我们编写了,是通过浏览器发送请求。
    然后,因为浏览器遵循的是http请求,所以我们在用socket进行返回时,需要遵循http响应的格式,将数据进行返回。
    目前为止,还没有学习框架,不能像java的spring那样。

    目前端口是写死在程序中,如果我们在Linux服务器中启动服务起,通过命令行的方式指定端口:
    1、导入模块
    import sys
    2、获取命令终端输入的数据
    sys.argv

    在这里插入图片描述
    这样就可以读取命令行传入的参数,通过指定端口进行启动。

    最终版,通过命令行方式启动

    import socket
    import sys
    import threading
    
    
    class HttpWebServer:
        def __init__(self, port):
            self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.tcp_server_socket.bind(("", port))
            self.tcp_server_socket.listen(128)
    
        def handle_client_request(self, client_socket):
            client_request_data = client_socket.recv(1024).decode()
            print(client_request_data)
            request_data = client_request_data.split(" ")
            print(request_data)
            if len(request_data) == 1:
                client_socket.close()
                return
            request_path = request_data[1]
            if request_path == "/":
                request_path = "/index.html"
            try:
                with open("./static" + request_path, "rb") as f:
                    file_data = f.read()
            except Exception as e:
                response_line = "HTTP/1.1 404 Not Found \n"
                response_header = "Server:pwb\n"
                response_body = "404 Not Found sorry"
                response_data = (response_line + response_header + "\n").encode() + response_body.encode()
                client_socket.send(response_data)
            else:
                response_line = "HTTP/1.1 200 OK \n"
                response_header = "Server:pwb\n"
                response_body = file_data
                response_data = (response_line + response_header + "\n").encode() + response_body
                client_socket.send(response_data)
            finally:
                client_socket.close()
    
        def start(self):
            while True:
                client_socket, client_addr = self.tcp_server_socket.accept()
                print("客户端地址:", client_addr)
                sub_thread = threading.Thread(target=self.handle_client_request, args=(client_socket,))
                sub_thread.start()
    
    
    def main():
        if len(sys.argv) != 2:
            print("格式错误 python xxx.py 9090")
            return
        if not sys.argv[1].isdigit():
            print("格式错误 python xxx.py 9090")
            return
        port = int(sys.argv[1])
        my_web_server = HttpWebServer(port)
        my_web_server.start()
    
    
    if __name__ == '__main__':
        main()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
  • 相关阅读:
    Git分布式版本控制系统——git学习准备工作
    书写台灯哪种比较适合儿童?分享光线舒适的护眼台灯
    【JavaScript高级进阶】初识类,函数进阶,如何改变this指向
    计算机网络第6章应用层 单元测试(习题+答案+图文解析)
    Linux :realpath 命令
    【每日一题】318. 最大单词长度乘积-2023.11.6
    Ubuntu 22.04 LTS 入门安装配置&优化、开发软件安装一条龙
    logging日志及其使用代码
    Godot快速精通-从看懂英文文档开始-翻译插件
    Gillespie 随机模拟算法附matlab代码
  • 原文地址:https://blog.csdn.net/m0_48639280/article/details/128177468