http服务器与框架(简易流程)

1.初始化tcp服务器

2. 循环接收客户端的请求

3. 处理客户端的请求

4.关闭

面向对象的时候要合理的使用魔法方法

import socket
import threading
import model

class WebServer(object):
def client_exec(self, client):
“”"
客户端的处理

	:param client:
	:return:
	"""

	# 1.得到请求的路径
	# 2.根据不同的地址返回不同的响应内容
	# 3. 关闭

	# 1.1 得到请求的数据
	# 1.2 判断当前是否有数据
	# 1.2.1如果有数据,那么解析
	# 1.2.2如果没有数据那么直接退出

	# 增强代码的健壮性,接收的信息需要当心
	recv_data = client.recv(1024)
	if recv_data:
		# 说明有数据
		# 解码数据
		data = recv_data.decode("utf-8")
		# 得到对应的地址
		try:
			split_data = data.split(" ", maxsplit=2)
			# 得到路径
			file_path = split_data[1]
			# 判断当前的路径如果是/那么定位到/index.html
			if file_path == "/":
				file_path = "/index.html"



		except Exception as e:
			print("解析地址的地址出错:", e)
			# 直接 退出
			client.close()
			return


	else:
		# 说明没有数据
		# 直接退出
		client.close()
		return

	# 静态资源一种动态资源
	# 静态的处理都是统一,二进制读取返回

	# 根据资源的特性进行相应的处理,静态资源统一处理,动态资源判断处理
	# 动态的资源后缀是.html
	# 根据不同的路径返回不同的响应体
	if file_path.endswith(".html"):
		# 动态资源
		# 单独处理
		# 空行
		empty_line = "\r\n"

		# 响应体
		response_line, response_head, response_body =model.application(file_path)

		# 响应的内容
		response_content = response_line + response_head + empty_line + response_body

		# 发送响应格式的数据
		client.send(response_content.encode("utf-8"))
	else:
		# 静态资源
		# 统一处理

		try:
			# 响应的格式
			# 响应行
			response_line = "http/1.1 200 ok\r\n"
			# 响应头
			response_head = ""
			# 空行
			empty_line = "\r\n"
			# 响应体
			# 图片必须二进制读取
			with open('.%s' % file_path, 'rb') as f:
				response_body = f.read()

			# 响应内容
			response_content = response_line.encode("utf-8") + response_head.encode("utf-8") + empty_line.encode(
				"utf-8") + response_body

			# 发送响应内容
			client.send(response_content)
		except Exception as e:
			print("静态资源打开错误", e)
			# 响应行
			response_line = "http/1.1 404 not found\r\n"
			# 响应头
			response_head = ""
			# 空行
			empty_line = "\r\n"
			# 响应体
			# 图片必须二进制读取
			response_body = "not image is find!"

			# 响应内容
			response_content = response_line.encode("utf-8") + response_head.encode("utf-8") + empty_line.encode(
				"utf-8") + response_body.encode("utf-8")

			# 发送响应内容
			client.send(response_content)

	# 关闭
	client.close()

def runserver(self):
	while True:
		client, address = self.tcp_server.accept()
		# 3. 处理客户端的请求
		# 后期有可能会堵塞,那么把他单独放到一个线程中
		threading.Thread(target=self.client_exec, args=(client,)).start()
	# self.client_exec(client)
	# 4.关闭
	self.tcp_server.close()

def __init__(self):
	# 初始化套接字服务器
	# 1.创建套接字
	self.tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
	# 2.绑定端口与复用端口
	self.tcp_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
	self.tcp_server.bind(("", 8080))
	# 3.被动模式
	self.tcp_server.listen(128)

def main():
“”“web服务器”""
# 0.实例化webserver
server = WebServer()

# 1. 循环接收客户端的请求
server.runserver()

if name == ‘main’:
main()

model-根据解析的地址返回不同响应体

def application(file_path):
# 响应行
response_line = “http/1.1 200 ok \r\n”
# 响应头
response_head = “”
if file_path == “/index.html”:

	# 打开前端的界面
	response_body = "index page is show!"

elif file_path == "/center.html":

	# 打开前端的界面
	response_body = "center page is show!"

elif file_path == "/login.html":

	# 打开前端的界面
	with open("./post.html", 'r',encoding="utf-8") as f:
		response_body = f.read()

else:
	# 组一个响应格式的数据
	# 响应行
	response_line = "http/1.1 404 not found \r\n"

	# 打开前端的界面
	response_body = "not page is show!"

return response_line,response_head,response_body
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值