发布时间:2025-06-24 18:30:56  作者:北方职教升学中心  阅读量:132


如果客户端断开连接,捕获到 ConnectionClosed异常,并从 clients集合中移除该客户端。

asyncdefhandle_client(self,websocket):# 新的客户端连接self.clients.add(websocket)try:asyncformessage inwebsocket:print(f"收到消息: {message}")# 回显消息给客户端awaitwebsocket.send(f"服务器已收到: {message}")exceptwebsockets.ConnectionClosed ase:print(f"客户端断开连接: {e}")finally:# 移除断开的客户端self.clients.remove(websocket)

handle_client是一个异步方法,用来处理与客户端的连接。实时聊天、

asyncdefstart(self):print(f"启动 WebSocket 服务器: ws://{self.host}:{self.port}")asyncwithwebsockets.serve(self.handle_client,self.host,self.port):awaitasyncio.Future()# 持续运行直到手动停止

start方法启动 WebSocket 服务器,通过 websockets.serve()启动一个 WebSocket 服务,该服务会监听来自客户端的连接请求,并调用 handle_client方法处理这些请求。

简介

WebSocket 是一种基于 TCP 协议的通信协议,能够在客户端与服务器之间进行全双工(双向)通信。

if__name__ =="__main__":asyncio.run(main())

最后,我们 asyncio.run(main())启动了整个程序。

我通过 Python 实现一个简单的 WebSocket 服务器,并使其与客户端进行通信。在客户端发送消息时,服务器会接收到该消息,并通过 websocket.send()方法将回显消息发送给客户端。相比传统的 HTTP 协议,WebSocket 可以实现实时数据的传输,尤其适合需要实时交互的应用场景,如在线游戏、

安装 WebSocket 库

在开始之前,需要安装 websockets库,它是 Python 中非常流行的 WebSocket 实现。同时,服务器也能够定时向所有连接的客户端发送消息。

asyncdefsend(self,message):"""向所有连接的客户端发送消息"""ifnotself.clients:print("没有客户端连接,无法发送消息")returndisconnected_clients =set()forclient inself.clients:try:awaitclient.send(message)exceptwebsockets.ConnectionClosed:disconnected_clients.add(client)# 清理已断开的客户端self.clients -=disconnected_clients

send方法允许服务器向所有连接的客户端发送消息。如果有客户端断开连接,服务器会将其从 clients集合中移除。

periodic_task =asyncio.create_task(send_data_periodically())# 并发运行所有任务awaitasyncio.gather(websocket_task,periodic_task)

通过 asyncio.create_task()启动了定时任务,并通过 asyncio.gather()并发运行 WebSocket 服务器和定时发送消息的任务。

完整代码

websocket.py

importasyncioimportwebsocketsclassWebSocketServer:def__init__(self,host="localhost",port=8765):self.host =host        self.port =port        self.clients =set()# 存储所有连接的客户端asyncdefhandle_client(self,websocket):# 新的客户端连接self.clients.add(websocket)try:asyncformessage inwebsocket:print(f"收到消息: {message}")# 回显消息给客户端awaitwebsocket.send(f"服务器已收到: {message}")exceptwebsockets.ConnectionClosed ase:print(f"客户端断开连接: {e}")finally:# 移除断开的客户端self.clients.remove(websocket)asyncdefsend(self,message):"""向所有连接的客户端发送消息"""ifnotself.clients:print("没有客户端连接,无法发送消息")returndisconnected_clients =set()forclient inself.clients:try:awaitclient.send(message)exceptwebsockets.ConnectionClosed:disconnected_clients.add(client)# 清理已断开的客户端self.clients -=disconnected_clients    asyncdefstart(self):print(f"启动 WebSocket 服务器: ws://{self.host}:{self.port}")asyncwithwebsockets.serve(self.handle_client,self.host,self.port):awaitasyncio.Future()# 持续运行直到手动停止

main.py

importasynciofromwebsocket importWebSocketServerasyncdefmain():# 创建 WebSocket 服务器实例websocket_server =WebSocketServer()websocket_task =asyncio.create_task(websocket_server.start())# 启动 WebSocket 服务器# 定时向 WebSocket 客户端发送数据asyncdefsend_data_periodically():whileTrue:awaitasyncio.sleep(5)# 每 5 秒发送一次数据awaitwebsocket_server.send("服务器定时发送消息:ping")periodic_task =asyncio.create_task(send_data_periodically())# 并发运行所有任务awaitasyncio.gather(websocket_task,periodic_task)if__name__ =="__main__":asyncio.run(main())

代码解析
importasyncioimportwebsocketsclassWebSocketServer:def__init__(self,host="localhost",port=8765):self.host =host        self.port =port        self.clients =set()# 存储所有连接的客户端

首先,我创建了一个 WebSocketServer类,它的构造方法初始化了服务器的主机地址 host和端口号 port,同时维护了一个客户端集合 clients来存储当前连接的 WebSocket 客户端。

main.py— 启动 WebSocket 服务器并定时发送消息

main.py文件中,创建了一个 WebSocket 服务器的实例,并启动了一个定时任务,定期向连接的客户端发送消息。金融交易等。我们将创建两个 Python 文件:websocket.pymain.pywebsocket.py负责实现 WebSocket 服务器的功能,main.py负责启动和管理服务器,以及定时向客户端发送消息。

pip install websockets

websocket.py— WebSocket 服务器实现

websocket.py文件中,我定义了一个 WebSocketServer类,包含了 WebSocket 服务器的主要逻辑。

# 定时向 WebSocket 客户端发送数据asyncdefsend_data_periodically():whileTrue:awaitasyncio.sleep(5)# 每 5 秒发送一次数据awaitwebsocket_server.send("服务器定时发送消息:ping")

send_data_periodically是一个定时任务,每隔 5 秒就向所有连接的客户端发送一次 "服务器定时发送消息:ping"

总结

通过这两个文件,实现了一个简单的 WebSocket 服务器,该服务器能够接收客户端消息并进行回显。

代码解析
importasynciofromwebsocket importWebSocketServerasyncdefmain():# 创建 WebSocket 服务器实例websocket_server =WebSocketServer()websocket_task =asyncio.create_task(websocket_server.start())# 启动 WebSocket 服务器

main()函数中,首先创建了 WebSocketServer的实例,并启动了 WebSocket 服务器。await asyncio.Future()会让服务器持续运行,直到手动停止。