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

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条回答 默认 最新

  • Java Fans 全栈领域优质创作者 2023-07-05 17:31
    关注

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

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

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

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

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

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

报告相同问题?

问题事件

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

悬赏问题

  • ¥15 有人会用py或者r画这种图吗
  • ¥15 MOD04_3K图像预处理
  • ¥15 [VASP]关于超胞大小和k 点网格的收敛性测试
  • ¥15 pip下载paddle2onnx离谱错误
  • ¥60 db2move nlzxams import 导出db2备份数据报错
  • ¥15 关于#python#的问题:全文总结功能咨询
  • ¥15 俄罗斯方块中无法同时消除多个满行
  • ¥15 c#转安卓 java html
  • ¥15 使用gojs3.0,如何在nodeDataArray设置好text的位置,再go.TextBlock alignment中进行相应的改变
  • ¥15 psfusion图像融合指标很低