python进程、线程、协程、多任务实现tcp/http服务器

1.多进程:

import socket
import multiprocessing
import re


class Server(object):

    def __init__(self, port):
        """
        在初始化中做好tcp连接的准备工作
        """

        #1创建一个tcp套接字
        self.tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # 端口重复使用
        self.tcp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        #2.绑定本地端口
        self.tcp_socket.bind(("", port))

        #3.设置监听
        self.tcp_socket.listen(128)

    def run_server(self):
        """
        循环运行服务器
        """
        while True:

            #1.等待用户接入
            new_socket, addr = self.tcp_socket.accept()

            #2.为用户提供服务,创建多线程
            p = multiprocessing.Process(target=self.content, args=(new_socket,))
            p.start()
            # 因为进程会复制一份再去运行,所以在这里要关掉主进程的客户链接
            new_socket.close()

        #3.关闭套接字
        self.tcp_socket.close()

    def content(self, new_socket):

        #1.接受消息
        client_message = new_socket.recv(1024).decode("utf-8")

        #对接收的的请求信息进行分析筛选
        request_message = client_message.splitlines()
        # print(request_message[0])
        if request_message:
            hanld_result = re.match(r"[^/]+(/[^ ]*)", request_message[0])
            print(hanld_result.group(1))

        #2.返回消息给用户
        # if hanld_result:
            file_name = hanld_result.group(1)
            if file_name == "/":
                file_name = "/index.html"
            try:
                file = open("./html"+file_name, "rb")

            except:

                response = "HTTP/1.1 404 NOT FOUND\r\n\r\n"
                new_socket.send(response.encode("utf-8"))
                new_socket.send("<h1>404 NOT FOUND</h1>".encode("utf-8"))

            else:
                response = "HTTP/1.1 200 OK\r\n\r\n"
                new_socket.send(response.encode("utf-8"))

                html = file.read()
                file.close()

                new_socket.send(html)


        #3.关闭new_socket客户连接
        new_socket.close()


def main():

    server1 = Server(7758)
    server1.run_server()


if __name__ == '__main__':

   main()

2.多线程

import socket
import threading
import re


class Server(object):

    def __init__(self, port):
        """
        在初始化中做好tcp连接的准备工作
        """

        #1创建一个tcp套接字
        self.tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # 端口重复使用
        self.tcp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        #2.绑定本地端口
        self.tcp_socket.bind(("", port))

        #3.设置监听
        self.tcp_socket.listen(128)

    def run_server(self):
        """
        循环运行服务器
        """
        while True:

            #1.等待用户接入
            new_socket, addr = self.tcp_socket.accept()

            #2.为用户提供服务,创建多线程
            t = threading.Thread(target=self.content, args=(new_socket,))
            t.start()
        #3.关闭套接字
        # self.tcp_socket.close()

    def content(self, new_socket):

        #1.接受消息
        client_message = new_socket.recv(1024).decode("utf-8")

        #对接收的的请求信息进行分析筛选
        request_message = client_message.splitlines()
        # print(request_message[0])
        if request_message:
            hanld_result = re.match(r"[^/]+(/[^ ]*)", request_message[0])
            print(hanld_result.group(1))

        #2.返回消息给用户
        # if hanld_result:
            file_name = hanld_result.group(1)
            if file_name == "/":
                file_name = "/index.html"
            try:
                file = open("./html"+file_name, "rb")

            except:

                response = "HTTP/1.1 404 NOT FOUND\r\n\r\n"
                new_socket.send(response.encode("utf-8"))
                new_socket.send("<h1>404 NOT FOUND</h1>".encode("utf-8"))

            else:
                response = "HTTP/1.1 200 OK\r\n\r\n"
                new_socket.send(response.encode("utf-8"))

                html = file.read()
                file.close()

                new_socket.send(html)


        #3.关闭new_socket客户连接
        new_socket.close()


def main():

    server1 = Server(7758)
    server1.run_server()


if __name__ == '__main__':

   main()

3.协程

import socket
import gevent
import re
from gevent import monkey
monkey.patch_all()


class Server(object):

    def __init__(self, port):
        """
        在初始化中做好tcp连接的准备工作
        """

        #1创建一个tcp套接字
        self.tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # 端口重复使用
        self.tcp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        #2.绑定本地端口
        self.tcp_socket.bind(("", port))

        #3.设置监听
        self.tcp_socket.listen(128)

    def run_server(self):
        """
        循环运行服务器
        """
        while True:

            #1.等待用户接入
            new_socket, addr = self.tcp_socket.accept()

            #2.为用户提供服务,创建多线程
            g = gevent.spawn(self.content,new_socket)
            # g.join()
        #3.关闭套接字
        # self.tcp_socket.close()

    def content(self, new_socket):

        #1.接受消息
        client_message = new_socket.recv(1024).decode("utf-8")

        #对接收的的请求信息进行分析筛选
        request_message = client_message.splitlines()
        # print(request_message[0])
        if request_message:
            hanld_result = re.match(r"[^/]+(/[^ ]*)", request_message[0])
            print(hanld_result.group(1))

        #2.返回消息给用户
        # if hanld_result:
            file_name = hanld_result.group(1)
            if file_name == "/":
                file_name = "/index.html"
            try:
                file = open("./html"+file_name, "rb")

            except:

                response = "HTTP/1.1 404 NOT FOUND\r\n\r\n"
                new_socket.send(response.encode("utf-8"))
                new_socket.send("<h1>404 NOT FOUND</h1>".encode("utf-8"))

            else:
                response = "HTTP/1.1 200 OK\r\n\r\n"
                new_socket.send(response.encode("utf-8"))

                html = file.read()
                file.close()

                new_socket.send(html)


        #3.关闭new_socket客户连接
        new_socket.close()


def main():

    server1 = Server(7758)
    server1.run_server()


if __name__ == '__main__':

   main()

猜你喜欢

转载自blog.csdn.net/zhangbiaoxiaoming/article/details/84637168