无论多么想 2023-07-05 15:50 采纳率: 66.7%
浏览 241
已结题

websocket客户端只能及时接收到第一条消息

websocket通信,服务端每秒一条消息,客户端只能及时接收到第一条消息,剩余的要等服务端发送完所有信息才能接收到,这还是为什么?
服务端代码

import websockets


async def handle_message(websocket, path):
    async for message in websocket:
        # 在这里处理收到的消息
        print(f"Received message: {message}")

        # 发送回复消息
        reply = f"Replying to: {message}"
        for i in range(10):
            await websocket.send(reply)
            time.sleep(1)
            print(f"Sent reply: {reply}", datetime.now())


# 创建 WebSocket 服务端
start_server = websockets.serve(handle_message, '0.0.0.0', 8765)

# 启动事件循环
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

客户端代码


async def connect_websocket():
    uri = "ws://localhost:8765"  # WebSocket 服务器地址

    async with websockets.connect(uri) as websocket:
        print("WebSocket connection opened")

        await websocket.send("asd")
        while True:
            message = await websocket.recv()
            print("Received message:", message, datetime.now())

            if not websocket.open:
                break

# 运行 WebSocket 客户端
asyncio.get_event_loop().run_until_complete(connect_websocket())

日志打印

img

  • 写回答

2条回答 默认 最新

  • 趣享先生 优质创作者: 编程框架技术领域 2023-07-05 17:31
    关注

    根据你提供的代码,我注意到你的服务端代码在发送回复消息时使用了一个循环,并在每次发送后使用了time.sleep(1)来暂停1秒钟。这可能是导致客户端只能及时接收到第一条消息的原因之一。

    在WebSocket通信中,服务端和客户端之间的消息传递是异步的。当服务端发送多条消息时,客户端可能无法及时接收到所有消息,因为客户端可能在接收到第一条消息后就开始处理它,而不会立即接收后续的消息。

    为了解决这个问题,你可以尝试在服务端发送消息之间添加一些延迟,以便给客户端足够的时间来接收和处理消息。你可以使用await asyncio.sleep(1)来替代time.sleep(1),以确保不会阻塞事件循环。

    另外,你的客户端代码中使用了一个无限循环来接收消息,但没有在循环中添加任何延迟。这可能导致客户端一直在接收消息,而无法处理其他任务。你可以考虑在每次接收消息后添加一个适当的延迟,以便给客户端处理消息的时间。

    答题不易,如若有用,还望博友采纳!感谢啦!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月13日
  • 已采纳回答 7月5日
  • 创建了问题 7月5日