长连接 单任务非堵塞 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)
其他的东西,主要就是理解了,根据代码,读懂什么流程最关键
下面是效果图: