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

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

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

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

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

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

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7783219
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:WebSocket 原生socket实现,服务端和客户端以及 html 客户端 三端效果都可以测试
  • 除此之外, 这篇博客: 为什么需要 WebSocket协议?中的 🚀服务端实时通信有哪些方法? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    1、AJAX轮询
    2、Long Polling长轮询
    3、WebSocket

  • 您还可以看一下 可用行师老师的物联网即时通信架构实现与实战课程中的 linux上多进程多协议测试websocket数据收发小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    问题标题: Why does the websocket client only receive the first message in a timely manner?

    问题内容: 我正在尝试使用websocket进行通信,但是无论服务端每秒发送多少条消息,客户端似乎只能及时接收到第一条消息,而剩下的消息需要等待服务端发送完所有信息才能接收到。请问这是为什么?

    服务端代码(请提供相应的服务端代码):

    import asyncio
    import websockets
    
    async def server(websocket, path):
        while True:
            await websocket.send("Message 1")
            await asyncio.sleep(1)
            await websocket.send("Message 2")
            await asyncio.sleep(1)
            await websocket.send("Message 3")
            await asyncio.sleep(1)
    
    start_server = websockets.serve(server, "localhost", 8765)
    
    asyncio.get_event_loop().run_until_complete(start_server)
    asyncio.get_event_loop().run_forever()
    

    客户端代码(请提供相应的客户端代码):

    import asyncio
    import websockets
    
    async def client():
        uri = "ws://localhost:8765"
        async with websockets.connect(uri) as websocket:
            while True:
                message = await websocket.recv()
                print(message)
    
    asyncio.get_event_loop().run_until_complete(client())
    

    日志打印(如果有相应的日志,请提供相关日志信息):

    根据你提供的问题描述,可能是客户端代码中缺少了异步循环监听接收消息的过程。可以尝试修改客户端代码如上所示,使用异步循环来持续接收消息。

    如果问题仍然存在,请提供更详细的日志信息以便进一步排查问题。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^