美文网首页
python静态服务器开发

python静态服务器开发

作者: 程序员Darker | 来源:发表于2019-03-04 15:19 被阅读0次

    http协议

    请求

    # 请求行 请求方式  得到的文件  协议版本
    GET /index.html HTTP/1.1
    # 请求头 告诉服务器 我的特征 我有什么 我能做什么 我需要什么 我能接受什么
    Host: 127.0.0.1:8888
    # 保持长连接 close 短连接 
    Connection: keep-alive
    Upgrade-Insecure-Requests: 1
    # 浏览器信息 非常重要
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
    # 我能处理的文件格式
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
    # 我能接收的压缩方式
    Accept-Encoding: gzip, deflate, br
    # 我能接收的语言
    Accept-Language: zh-CN,zh;q=0.9
    
    

    响应

    # 响应行
    HTTP/1.1 200 OK
    # 响应头
    Server: codewen
    # 告诉浏览器我的文件类型和编码
    Content-Type: text/html;charset=UTF-8
    # 响应头和响应体之间要空行
    
    # 响应主体
    aaaaaaa
    

    长连接:3次握手,浏览器发一送一次请求,服务器响应请求,浏览器发一送一次请求,服务器响应请求,浏览器发一送一次请求,服务器响应请求,如果长时间没有请求,服务端断开连接,4次分手

    短连接:3次握手,浏览器发一送一次请求,服务器响应请求,服务端断开连接,4次分手

    静态Web服务器

    
    from socket import *
    
    # 声明一个常量 网站根目录 全部大小写
    WEB_DIR = "html"
    
    
    def main():
        # 1.创建对象
        tcp_server = socket()
        # 2不会出现端口被占用
        tcp_server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
        # 2.绑定IP地址和端口
        tcp_server.bind(("", 9999))
        # 3.改主动为被动
        tcp_server.listen(5)
        # 4.等待连接
        while True:
            new_socket, client_info = tcp_server.accept()
            # 5.接收消息
            raw_data = new_socket.recv(1024)
    
            # 5.1 转码
            request_data = raw_data.decode("utf-8")
            # 5.2 按行分割
            request_data = request_data.splitlines()
            # 5.3 得到请求行 GET /2.html HTTP/1.1
            request_start_line = request_data[0]
    
            # 5.4 得到文件名 分割
            file_name = request_start_line.split(" ")[1]
            print(file_name)
            # 5.4.1 判断文件名是不是 / 如果是一个/ 那就是首页
            if file_name == "/":
                file_name = "/index.html"
            # 5.5 得到文件完整路径
            file_name = WEB_DIR + file_name
            # 5.6 打开文件
            try:
                with open(file_name, 'rb') as fr:
                    file_data = fr.read()
            except:
                # 6.响应
    
                response_start = "HTTP/1.1 404 Not found\r\n"
    
                response_header = "Server: codewen\r\n"
                response_header += "Content-Type: text/html;charset=UTF-8\r\n"
    
                response_body = "\r\n此网页不存在\r\n"
    
                data = response_start + response_header + response_body
                new_socket.send(data.encode('utf-8'))
    
                # 7.关闭
                new_socket.close()
            else:
                # print(f"{file_data}")
    
                # 6.响应
    
                response_start = b"HTTP/1.1 200 OK\r\n"
    
                response_header = b"Server: codewen\r\n\r\n"
    
                response_body = file_data
                data = response_start + response_header + response_body
                new_socket.send(data)
    
                # 7.关闭
                new_socket.close()
    
    
    if __name__ == '__main__':
        main()
    
    

    面向对象服务器

    
    
    from socket import *
    from multiprocessing import Process
    
    # 声明一个常量 网站根目录
    WEB_ROOT = "html"
    
    
    class WebServer(object):
        def __init__(self, port=8000, max_listen=5):
            # 1.创建Socket对象
            self.tcp_server = socket()
            # 设置socket属性为非阻塞
            self.tcp_server.setblocking(True)
            # 2不会出现端口被占用
            self.tcp_server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
            # 2.绑定IP地址和端口
            self.tcp_server.bind(("", port))
            # 3.把主动模式变成被动模式,一旦改变,这个Socket对象只能接,不能拨号
            self.tcp_server.listen(max_listen)
            print(f"当前服务端口:{port}")
    
        def handle_data(self, new_socket, client_info):
            print(f"有新的客户{client_info}来了")
            # 5.接收消息
            raw_data = new_socket.recv(1024)
            # 6.得到请求的信息
            request_data = raw_data.decode("utf-8")
            # 7. 按回车分割
            request_data_lines = request_data.splitlines()
            # 8. 得到第一行 请求行 GET /2.html HTTP/1.1
            request_data_start = request_data_lines[0]
            # 9. 得到文件外 "html" + "/2.html"
            file_name = WEB_ROOT + request_data_start.split(" ")[1]
            # 10. 得到文件的内容
            try:
                with open(file_name, "rb") as fr:
                    file_data = fr.read()
            except:
                # 11.响应
                # 响应行
                response_start = b"HTTP/1.1 404 Not Found\r\n"
    
                # 响应头
                response_header = b"Server: codewen\r\n"
                response_header += b"Content - Type: text / html;charset = UTF - 8\r\n\r\n"
    
                # 主体
                response_body = "此网页被吃掉了".encode("utf-8")
    
                response_data = response_start + response_header + response_body
                # 发送数据
                new_socket.send(response_data)
    
                # 6.关闭连接
                new_socket.close()
            else:
                # 11.响应
                # 响应行
                response_start = b"HTTP/1.1 200 OK\r\n"
    
                # 响应头
                response_header = b"Server: codewen\r\n"
                response_header += b"Content - Type: text / html;charset = UTF - 8\r\n\r\n"
    
                # 主体
                response_body = file_data
    
                response_data = response_start + response_header + response_body
                # 发送数据
                new_socket.send(response_data)
    
                # 6.关闭连接
                new_socket.close()
    
        def start(self):
    
            # 4.等待客户端连接
            while True:
                new_socket, client_info = self.tcp_server.accept()
    
                # 创建进程
                p = Process(target=self.handle_data, args=(new_socket, client_info))
                # 启动
                p.start()
                # 主进程关闭
                new_socket.close()
    
    
    def main():
        web = WebServer(9998)
        web.start()
    
    
    if __name__ == '__main__':
        main()
    
    
    

    HTTP状态码:http://21cto.com/article/1469

    一次完整的HTTP请求:https://blog.csdn.net/yipiankongbai/article/details/25029183

    ALT+J 批量替换

    Ctrl + P 查看函数参数提示

    Alt + enter 自动生成代码

    CTRL+E 打开最近的文件

    CTRL+D 复制一行

    CTRL+W 选中单词

    CTRL+F12 用来查看方法或函数

    CTRL+ALT+T

    TODO:用来标注还没有完成的事情

    Ctrl + 鼠标 简介/进入代码定义

    Ctrl + Alt + L 代码格式化

    相关文章

      网友评论

          本文标题:python静态服务器开发

          本文链接:https://www.haomeiwen.com/subject/sudiuqtx.html