摘要
使用python 基于tcp协议开发http web服务器(五)。
主要实现思想:将服务器和与客户端连接的套接字都转为非阻塞模式,然后通过不断循环,在一次循环里面,先检测是否有新客户端来连接,有的话就会返回一个新的套接字,将这个新的套接字加入到一个列表后,然后再遍历这个列表,得出目前的所有连接,一个一个的查看有没有发送过来数据,有数据过来则进一步处理。如果客户端关闭连接,就会返回None,紧接着就从列表中删除这个连接就行了
前置知识
这些都是一些基础知识,论坛里面都有写的很好的教程。
- tcp协议
- socket
python代码
import socket
from datetime import datetime
def main():
"""仅使用单进程、单线程来模拟实现并发http web服务器"""
# 创建tcp套接字
tcp_service_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_service_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 绑定ip和端口
tcp_service_socket.bind(("192.168.0.107", 8080))
# 将套接字从主动转为监听
tcp_service_socket.listen(124)
# 将套接字设为非阻塞
tcp_service_socket.setblocking(False)
# 用来存储连接的客户端
client_socket_list = list()
while True:
try:
# 看看有没有新客户端来连接,现在是非阻塞模式,没有新连接会抛出异常
client_socket, client_addr = tcp_service_socket.accept()
except Exception as e:
# 没有新连接到来
print("没有新的客户端连接")
else:
# 将与客户端连接的套接字也转为非阻塞
client_socket.setblocking(False)
# 将连接存入列表中
client_socket_list.append(client_socket)
# 遍历列表,逐个看看有没有发送数据过来
for index, client_socket in enumerate(client_socket_list):
try:
# 看看有没有数据,没有则抛出异常,客户端调用close这里返回None
recv_data = client_socket.recv(1024)
except Exception as e:
print("{} 客户端{}没有发送数据".format(datetime.now(), index+1))
else:
if recv_data:
# 发送了数据,进行下一步处理
print("客户端发送:", recv_data)
break
else:
# recv_data是None,说明客户端已经调用close,关闭连接
# 从列表中删除这个套接字
client_socket_list.remove(client_socket)
if __name__ == "__main__":
main()
建了一个python交流群,要是大家有疑问或者想交流的,欢迎进群交流,QQ群号码:891938703