简单的 web 服务器 gevent 携程

学习笔记

短连接

import socket
import gevent
from gevent import monkey

monkey.patch_all()

def process_client(new_socket):

    # 接收 request 请求
    request = new_socket.recv(1024)
    print(request)

    # 发送 response 请求
    # response header
    response = "HTTP/1.1 200 OK\r\n"
    response += "\r\n"

    # response body
    response += "<h1>hello python</h1>"
    new_socket.send(response.encode("utf-8"))

    new_socket.close()


def main():


    # 1. 建立套接字
    tcp_socket_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 2. 绑定地址
    tcp_socket_server.bind(("", 8088))

    # 3. 变被动为主动
    tcp_socket_server.listen(128)

    while True:
        # 4. 建立 accept  监听连接客户端
        new_socket, add_message = tcp_socket_server.accept()

        # 5. 处理请求
        gevent.spawn(process_client, new_socket)


    # tcp_socket_server.close()


if __name__ == "__main__":
    main()

gevent

import gevent

def f1():
    for i in range(5):
        print 'this is ' + str(i)
        gevent.sleep(0)

def f2():
    for i in range(5):
        print 'that is ' + str(i)
        gevent.sleep(0)

t1 = gevent.spawn(f1)
t2 = gevent.spawn(f2)
gevent.joinall([t1, t2])

如果是一个可以不用 joinall 函数

面向对象的形式

import socket
import re
import multiprocessing

class WSGIserver():

    def __init__(self):
        # 1. 建立套接字
        self.tcp_socket_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.tcp_socket_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

        # 2. 绑定地址
        self.tcp_socket_server.bind(("", 8088))

        # 3. 变被动为主动
        self.tcp_socket_server.listen(128)

    def process_client(self, new_socket):

        # 接收 request 请求
        request = new_socket.recv(1024).decode("utf-8")

        request_lines = request.splitlines()

        # GET /index.html HTTP/ 1.1
        ret = re.match(r"[^/]+(/[^ ]*)", request_lines[0])
        file_name = ""
        if ret:
            file_name = ret.group(1)
            if file_name == "/":
                file_name = "/index.html"

        # response body  html/file_name.html
        try:
            f = open("../html" + file_name, "rb")
        except:
            response = "HTTP/1.1 404 NOT FOUND\r\n"
            response += "\r\n"
            response += "not found file"
            new_socket.send(response.encode("utf=8"))
        else:
            html_comtent = f.read()
            f.close()
            # 发送 response 请求
            # response header
            response = "HTTP/1.1 200 OK\r\n"
            response += "\r\n"
            new_socket.send(response.encode("utf-8"))
            # 将 body 发送给浏览器
            new_socket.send(html_comtent)
        print(">" * 30, file_name)
        new_socket.close()


    def run(self):

        while True:
            # 4. 建立 accept  监听连接客户端
            new_socket, add_message = self.tcp_socket_server.accept()

            # 5. 处理请求
            p = multiprocessing.Process(target=self.process_client, args=(new_socket,))
            p.start()

        self.tcp_socket_server.close()

def main():
    # 创建对象 调用对象的 run 方法
    wsgi_sever = WSGIserver()
    wsgi_sever.run()


if __name__ == "__main__":
    main()

猜你喜欢

转载自blog.csdn.net/weixin_40639095/article/details/88633568