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

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

一、几点说明

显示连接用户
  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服务器抽象类)