1. 协程版注意打补丁来更新gevent的操作.并调用spawn来执行任务
# from gevent import monkey
# monkey.patch_all()2. 进程版需要导入multiprocessing模块来进行,并创建进程对象,使用start来开启进程
import reimport socket
import multiprocessing#进程版
class WebServer(object):
"""初始化服务器套接字"""
def __init__(self):
# 初始化服务器属性
self.server_soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server_soc.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 设置套接字复用地址
self.server_soc.bind(('', 1314))
self.server_soc.listen(128)
@staticmethod
def parse_http(request):
"""从浏览器请求里解析出资源路径"""
# 获取请求行
head_line = re.split(r'\r\n', request)
# 获取请求的资源路径
request_line = head_line[0]
# 获取到请求的资源路径
datas = re.split(r' ', request_line)
# 对路径的安全检查
path = datas[1]
if path == '/':
path = '/index.html'
return path
def handle_client(self, client_soc):
"""为一个客户端提供服务"""
# 接收请求头
recv_data = client_soc.recv(1024 * 4)
print(recv_data)
# 判断客户端是否关闭
if not recv_data:
print('浏览器已经关闭...')
client_soc.close()
return
# 获取用户请求的资源路径
path = WebServer.parse_http(recv_data.decode('utf-8'))
# 捕捉异常,找不到文件是讲返回一个数据
try:
# 读取文件内容
with open('html/index.html', 'rb') as file:
file_content = file.read()
# 返回响应数据
response_line = 'HTTP/1.1 200 OK\r\n'
response_head = 'Server: Itcastserver 1.0\r\n'
response = response_line + response_head + '\r\n'
response_body = file_content
client_soc.send(response.encode())
client_soc.send(response_body)
except:
# 读取404文件内容
with open('html/404.html', 'rb') as file:
file_content = file.read()
# 返回响应数据
response_line = 'HTTP/1.1 404 NOT FOUND\r\n'
response_head = 'Server: Itcastserver 1.0\r\n'
response = response_line + response_head + '\r\n'
response_body = file_content
client_soc.send(response.encode())
client_soc.send(response_body)
# 关闭套接字
client_soc.close()
def run_server(self):
"""开启服务器"""
while True:
# 获取客户端连接
print('正在获取客户端连接...')
client_soc, client_addr = self.server_soc.accept()
# 为一个客户端提供服务
# gevent.spawn(handle_client,client_soc)
p1 = multiprocessing.Process(target=self.handle_client, args=(client_soc,))
p1.start()
# 关闭服务器套接字
server_soc.close()
def main():
"""服务器模拟并能够响应浏览器的请求"""
# 创建服务器对象
server = WebServer()
# 开启服务器
server.run_server()
if __name__ == '__main__':
main()