最近在学习python,分享一下多进程的服务器
需要了解的一些知识(若这些不懂代码不好理解)
- 多进程 ,进程是系统进行资源分配和调度的单元,创建多进程能够实现多个任务同时进行的目的。python中实现多进程要运用到python标准库multiprocessing
- socket 模块,socket 套接字,类似一种载体,进程间通信的一种方式,服务器和客户端之间主要用socket进行数据传输。
- multiprocessing 模块用法,导入模块from multiprocessing import Process ,创建一个Process对象,每个process对象都是一个进程,
p = Processing(target= 函数, args=(函数的参数, ) )
开启这个进程:
p.start() - 正则表达式,从浏览器的请求报文中删选出用户访问的资源名称,运用到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()