以下是一个示例代码,可用于创建一个包含两个WebSocket的Asyncio Python WebSocket服务器,并模拟其中一个WebSocket始终关闭连接的情况。
import asyncio
import websockets
# 客户端id列表
client_list = []
async def handle_websocket(websocket, path):
# 将新连接的客户端id添加到client_list中
client_id = id(websocket)
client_list.append(client_id)
print(f'New connection from client {client_id}')
try:
while True:
# 接收客户端发送的消息
message = await websocket.recv()
print(f'Received message from {client_id}: {message}')
# 广播消息给所有客户端
for cid in client_list:
if cid == client_id:
continue
try:
# 发送消息给其他客户端
await asyncio.wait_for(websockets.connect(f'http://localhost:8000/{cid}'), timeout=5)
await websocket.send(f'From {client_id}: {message}')
except websockets.exceptions.ConnectionClosedError:
# 如果连接已关闭,则将其从client_list中删除
client_list.remove(cid)
finally:
# 如果websocket连接已关闭,则将其从client_list中删除
client_list.remove(client_id)
print(f'Connection closed from client {client_id}')
async def main():
# 创建两个WebSocket
ws_server = websockets.serve(handle_websocket, 'localhost', 8000)
ws_client = websockets.connect('ws://localhost:8000/')
# 在后台启动WebSocket服务器
async with ws_server:
await ws_server.start_serving()
# 在后台启动WebSocket客户端
async with ws_client:
while True:
# 持续发送消息到服务器
await ws_client.send('Hello, world!')
if __name__ == '__main__':
asyncio.run(main())
由于WebSocket客户端始终保持连接,因此当WebSocket服务器收到来自WebSocket客户端的消息时,它会将该消息广播