美文网首页Python学习
2018-06-06静态文件web服务器抽象类

2018-06-06静态文件web服务器抽象类

作者: 菩灵 | 来源:发表于2018-06-06 22:30 被阅读3次

    今天白天抽空学习了,没机会做笔记,晚上补上。

    一、几点说明

    显示连接用户
    1. 当显示连接用户的时候,显示有多个用户连接上了,(1)是因为是浏览器的一种预加载行为。(2)当程序出现问题的时候,服务器不能响应正确数据,浏览器可能会发送多次请求
    2. 可能会出来一个请求时:favion,就是网页小图标


      网页小图标
    3. 第一次请求时主页网址,主页的html只是一个框架,拿到了一系列信息,其中包含的文本只是图片的链接地址,而不是二进制图片;后面的图片都是后来发送请求再拿到的。

    二、Ctrl+C 和 Ctrl+Z 的一些说明

    Ctrl + C,会真正的kill一个进程
    Ctrl + Z,只是暂时把程序调到后台进行运行(bg 显示, fg 调到前台)


    Ctrl+C 和 Ctrl+Z

    三、静态服务器面向对象编程抽象

    为什么要有面向对象呢?
    ——封装:把我们的函数和它可能会用到一些变量绑定到一起,成为一个整体,提供一些特殊的方法供调用
    抽象从成面向对象的思维:用到什么的时候再去封装什么
    例如:跟服务器相关的属性和功能都可以封装到一起
    ——继承:为了把类中可以复用的代码最高效率利用(为了少写代码)
    ——多态:针对不同的实例,展现出不同的功能或属性(为了少写代码)
    *先面向过程再面向对象

    四、研究了最久的面向对象web案例

    代码奉上:

    # coding:utf-8
    
    import socket
    import re
    
    # 定义一个常量用来接收客户端发起的文件请求地址
    # 设置静态文件根目录
    HTML_ROOT_DIR = "./html"
    
    from multiprocessing import Process
    
    
    class HTTPServer(object):
        def __init__(self):
            self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    
        def start(self):
            self.server_socket.listen(128)
            while True:
                client_socket, client_address = self.server_socket.accept()
                print("[%s, %s]用户连接上了" % client_address)
                handle_client_process = Process(target=self.handle_client, args=(client_socket,))
                handle_client_process.start()
                client_socket.close()
    
        def handle_client(self, client_socket):
            # 获取客户端请求
            request_data = client_socket.recv(1024)
            print(request_data)
    
            # 判断用户发来的请求
            # 使用splitlines来切割不同行
            request_lines = request_data.splitlines()
            for line in request_lines:
                print(line)
    
            # GET / HTTP/1.1
            request_start_line = request_lines[0]
            file_name = re.match(r"\w+ +(/[^ ]*) ", request_start_line.decode("utf-8")).group(1)
    
            # 通常把常量写在“左边”,变量写在右边,防止少写一个“=”不报错
            if "/" == file_name:
                file_name = "/index.html"
    
            # 打开文件,读取内容(客户有可能请求图片资源:加上b)
            try:
                file = open(HTML_ROOT_DIR + file_name, "rb")
            except IOError:
                response_start_line = "HTTP/1.1 404 NOT FOUND\r\n"
                response_headers = "Sever: My Sever\r\n"
                response_body = "The file is not found!"
            else:
                file_data = file.read()
                file.close()
    
                # 构造响应数据
                response_start_line = "HTTP/1.1 200 OK\r\n"
                response_headers = "Sever: My Sever\r\n"
                response_body = file_data.decode("utf-8")
    
            response = response_start_line + response_headers + "\r\n" + response_body
            print("response data:", response)
    
            # 向客户端形响应数据
            client_socket.send(bytes(response, "utf-8"))
            # 关闭客户端连接
            client_socket.close()
    
        def bind(self, port):
            self.server_socket.bind(("", port))
    
    
    def main():
        http_server = HTTPServer()
        # http_server.set_port()
        http_server.bind(8080)
        http_server.start()
    
    
    if __name__ == "__main__":
        main()
    

    经过反复调试,成功,效果:


    面向对象web案例

    在此过程中学习了面向对象操作的一些常见坑:1、面向对象中新造的属性,前面不可少self. 2、请看第一条
    *另外注意,服务器通常用“server”表示,不用“sever”,学好英语是多么重要

    相关文章

      网友评论

        本文标题:2018-06-06静态文件web服务器抽象类

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