Python之Web服务器-多任务版本线程实现(五)

Python之Web服务器-多任务版本线程实现(五)

import socket
import re
import gevent
from gevent import mokey

# 打补丁, 让gevent失败耗时(time.sleep, 网络请求, accept, recv)操作,自动切换到其它协成执行对应的代码
monkey.pach_all()

# 自定义http web服务器类
class HttpWebServer(object):
	def __init__(self):
		# 创建tcp服务端套接字
		tcp_server_socket = socket.socket(socket.AF_INEF, socket.SOCK_STREAM)
		# 设置端口号复用
		tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
		# 给程序绑定端口号
		tcp_server_socket.listen(128)
		# 把创建的tcp服务器套接字作为web服务器对象的属性
		self.tcp_server_socket = tcp_server_socket
		#把创建的tcp服务套接字作为当前web服务器对象的属性
		self.tcp_server_socket = tcp_server_socket
	
	# 处理客户请求的操作
	@staticmethod
	def handle_client_request(service_client_socket):
		# 获取客户端发送的http请求报文数据
		http_request_data = service_client_socket.recv(4096)
		# 对二进制数据进行解码
		http_request_content = http_request_data.decode("utf-8")
		print(http_request_contenet)
		match_obj = re.search("/\S*, http_request_content)
		if match_obj:
			# 匹配成功, 获取请求的资源连接
			request_path = match_obj.groupp()
			# 判断请求的路径是否是根路径, 如果是根路径指定对应的文件
			if request_path == "/"
				request_path = "/index.html"
				try:
					# 打开文件读取文件中的数据
					with open("static" + request_path, "rb") as file:
						# 读取文件中的全部数据
						file_data = file.read()
				except Exception as e:
					# 404 没有在服务器找到请求的文件
					# 响应行
					response_line = "HTTP/1.1 404 NotFound\r\n"
					# 响应头, 提示:响应头信息程序员也可以根据自己的需要自定义一个响应头信息
	                   # Content-Type: text/html;charset=utf-8: 服务器告诉浏览器数据的类型及编码格式
					response_header = "Server:PWS/1.1\r\nother:ok\r\nContent-Type:text/html;charset=utf-8\r\n"
					# 响应体
					response_body = "<h1>非常抱歉, 您访问的页面已经不存在了</h1>"
					# 组装http响应报文数据
					response_data = (respose_line + respose_header + "\r\n" + response_body).encode("utf_8")
					# 发送http 响应报文数据给客户端
					service_client_socket.send(response_data)
				else:
					# 找到了请求的资源文件, 发送200的状态
					# 响应行
					response_line = "HTTP/1.1 200 OK\r\n"
					# 响应头
					response_header = "Server:PWS/1.1\r\nother:ok\r\nContent-Type:text/heml;charset=utf-8\r\n"
					# 响应体
					response_body = file_data
					# 组装http响应报文数据
					response_data = (response_line + response_header + "\r\n").encode("utf-8") + response_body
					# 发送http响应报文数据给客户端
					service_client_socket.send(response_data)
			# 关闭套接字
			service_client_socket.close()
	# 启动web服务器进行工作
	def start(self):
		while True:
			# 等待接收客户端的连接请求
			service_client_socket, ip_port = self.tcp_server_socket.accpt()
			# 创建协程指定对应执行任务
			gevent.spawn(self.handle_client_request, service_clinent_socket)
	
	# 提示: 这里不需要加上jion, 因为主线程会一直运行,并且循环里面有耗时操作, 会自动切换到不同协程执行代码
if __name__ == '__main__':
	# 创建web服务器对象 -> 通过web服务器类来创建
	web_server = HttpWebServer()
	# 让web服务器启动进行工作
	web_server.start()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值