python创建多进程服务器浏览器返回静态页面

最近在学习python,分享一下多进程的服务器

需要了解的一些知识(若这些不懂代码不好理解)

  1. 多进程 ,进程是系统进行资源分配和调度的单元,创建多进程能够实现多个任务同时进行的目的。python中实现多进程要运用到python标准库multiprocessing
  2. socket 模块,socket 套接字,类似一种载体,进程间通信的一种方式,服务器和客户端之间主要用socket进行数据传输。
  3. multiprocessing 模块用法,导入模块from multiprocessing import Process ,创建一个Process对象,每个process对象都是一个进程,
    p = Processing(target= 函数, args=(函数的参数, ) )
    开启这个进程:
    p.start()
  4. 正则表达式,从浏览器的请求报文中删选出用户访问的资源名称,运用到python的标准库 re模块 。
# re正则模块
import re
# 导入多进程的模块
import multiprocessing
# 导入套接字模块
import socket

class Server(object):
    '''创建一个具体的服务器类'''
    def __init__(self, server_address):
        # 创建套接字连接
        self.listen_soket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # 防止服务器强制断开,端口无法使用的问题
        self.listen_soket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        # 绑定ip和端口 sever_address是传入的参数
        self.listen_soket.bind(server_address)
        # 把套接字变为监听状态,监听浏览器的来访
        self.listen_soket.listen(128)

    def handle_client(self,cli_socket):
        # 浏览器发送来的请求信息
        recv_data = cli_socket.recv(1024).decode('utf-8')
        # 请求报文 ,对报文进行按行分割,请求报文是一行一行的信息GET / HTTP/1.1
        request_lines = recv_data.splitlines()
        # request_lines是一个列表,列表的第一个元素代表第一行报文,里面有请求资源的信息
        # 利用正则表达式匹配出请求的资源路径,r'[^/]+([^ ]*)' 意思是:r代表原始字符格式,
        # 匹配 至少一个非/字符,/开始就是请求资源名称,路径名称后面跟着的是空格
        file_name = re.match(r'[^/]+([^ ]*)', request_lines[0]).group(1)
        # index.html是我文件夹里的html文件,默认访问这个文件
        if file_name == '/':
            file_name = ROOT + '/index.html'
        else:
            file_name = ROOT + file_name
        try:
            f = open(file_name, 'rb')
        except:
            # 没找到文件资源后,响应报文的内容
            response_lines = 'HTTP1.1/ 404 NOT FOUND\r\n' + '\r\n'
            response_body = '<h1>there is no file </h1>'
        else:
            # 读取访问的文件内容作为报文体,加上报文头
            file_content = f.read()
            response_lines = 'HTTP1.1/ 200 OK\r\n' + '\r\n'
            response_body = file_content
        finally:
            # 用套接字传递给浏览器
            cli_socket.send(response_lines).encode('utf-8')
            cli_socket.send(response_body)
            cli_socket.close()

    def server_forver(self):
        while True:
            # 循环可以让多个浏览器同时访问,listen_socket监听来来访的浏览器,
            # accept返回的是元组,来访浏览器的ip地址和端口
            cli_socket, cli_address = self.listen_soket.accept()
            #  创建多进程 multiprocessing中的Process类创建对象
            p = multiprocessing.Process(target=handle_client, args=(cli_socket,))
            # 开始运行进程
            p.start()
            cli_socket.close()


# ROOT为网页文件的根目录,html是一个文件加的名称
ROOT = './html'
# IP地址 和 端口,默认是本机ip
SERVER_ADD = (HOST, PORT) = '',7878

def main():
    # 创建服务器对象
    mysever = Server(SERVER_ADD)
    # 调用服务器对象的方法
    mysever.server_forver()


if __name__ == '__main__':
    main()
发布了19 篇原创文章 · 获赞 10 · 访问量 2477

猜你喜欢

转载自blog.csdn.net/qq_40125653/article/details/84572959