长连接 单任务非堵塞 HTTP服务器的是实现

长连接 单任务非堵塞 HTTP服务器的是实现

经过晋升学习,有了新阶段的认识,实现了长连接 单任务非堵塞 HTTP服务器,下面是具体代码片段:

import socket
import re
import time


def server_c(new_socket, list_newsock):
	new_socket.setblocking(False)
	# 接受客户端发来的消息
	try:
		list_newsock.append(new_socket)
		request = new_socket.recv(1024).decode("utf-8")

	except:
		print("---------未收到客户端的消息-----------")

	else:
		for client_servre in list_newsock:
			if request:
				# 把客户端请求的信息 提取出有用的请求页面信息
				line = request.splitlines()
				result = re.match(r"[^/]+(/[^ ]*)", line[0])
				# 提取需要的页面信息
				try:
					html_msg = result.group(1)
					# 打开请求的页面,读取网页源码,发送给浏览器
					f = open("." + html_msg, "rb")
					content = f.read()
					# 发送回应的头部信息
					response = "HTTP/1.1 200 OK\r\n"
					response += "Content-Length:%d\r\n" % len(content)
					response += "\r\n"
					client_servre.send(response.encode("utf-8"))
					# 发送请求的页面主体信息
					client_servre.send(content)
					client_servre.close()
					print("-------为客户端服务完成-----------")
				except:
					response = "HTTP/1.1 404 Error\r\n"
					response += "\r\n"
					response += "---------------Error----------404---------"
					client_servre.send(response.encode("utf-8"))
					client_servre.close()
			else:
				print("-----------客户端已关闭---------")
				list_newsock.remove(client_servre)
				client_servre.close()


def main():
	# 创建一个套接字
	tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
	# 绑定ip 和port
	tcp_socket.bind(("", 7890))
	# 设置侦听套接字
	tcp_socket.listen(128)
	tcp_socket.setblocking(False)
	list_newsock = list()
	while True:
		# 等待客户端的连接
		try:
			new_socket, user_addr = tcp_socket.accept()
		except:
			print("----------没有客户端连接----------")
			time.sleep(0.5)
		# 连接客户端,为客户端服务
		else:
			server_c(new_socket, list_newsock)
			
		#gevent.spawn(server_c, new_socket)
		# new_socket.close()
		# server_c(new_socket)

	tcp_socket.close()


if __name__ == '__main__':
	main()

这里面最关键的一句代码:response += "Content-Length:%d\r\n" % len(content)
其他的东西,主要就是理解了,根据代码,读懂什么流程最关键
下面是效果图:长连接 单任务非堵塞 HTTP服务器的是实现_第1张图片

你可能感兴趣的:(笔记)