weixin_45840746 2023-03-13 19:35 采纳率: 35.6%
浏览 69
已结题

python:websocket主动发消息,并接受消息

python 使用websocket为什么我能主动发 就不能收哎 await send(websocket)可以,再加上await rev()就不行了

clients = set()

newValue = ''
oldValue = ''
msg = ''

# 读串口


async def readLoop():
    global newValue
    print('开始读串口')
    port = "COM3"  # 修改为自己的串口
    bps = 9600
    bytesize = 8
    ser = serial.Serial(port, int(bps), int(bytesize),
                        timeout=1, parity=serial.PARITY_NONE, stopbits=1)
    while True:
        buffer = await asyncio.to_thread(ser.readline)  # 异步读取串口数据
        buffer = buffer.decode().strip()
        print(buffer)
        if buffer == '':
            continue
        if buffer == 'a':
            newValue = 'a'
        elif buffer == 'b':
            newValue = 'b'


# WebSocket 服务器
async def eho(websocket, path):
    global newValue, oldValue, clients
    # clients.clear()
    clients.add(websocket)
    print(len(clients), newValue, oldValue)

    await send(websocket)
    await rev(websocket)
     

# 发消息
async def send(websocket):
    global newValue, oldValue
    while True:
        if newValue != oldValue:
            websockets.broadcast(clients, newValue)
            oldValue = newValue
        else:
            await asyncio.sleep(random.random() * 1)

# 接收消息
async def rev(websocket):
    global msg
    while True:
        msg = await websocket.recv()
        print(msg)

    # 主函数


def main():
    t1 = Thread(target=lambda: asyncio.run(readLoop()))  # 在新线程中异步执行readLoop函数
    t1.start()
    start_server = websockets.serve(eho, "127.0.0.1", 5678)
    print('Websocket 服务器已启动')
    try:
        asyncio.get_event_loop().run_until_complete(start_server)
        asyncio.get_event_loop().run_forever()
    except KeyboardInterrupt:
        print('程序已结束')
        t1.join()  # 关闭线程


  • 写回答

7条回答 默认 最新

  • CodeBytes 2023-03-13 20:00
    关注

    该回答引用ChatGPT

    如有疑问,可以回复我!

    根据你提供的代码,我发现在 eho 函数中,你调用了 await send(websocket) 和 await rev(websocket),但是你并没有对 rev 函数进行任何处理,它会一直在一个无限循环中等待接收消息,导致后面的代码无法执行。

    你可以将 rev 函数放在另一个协程中,并在 eho 函数中使用 asyncio.gather 并发运行两个协程,代码示例如下:

    
    async def eho(websocket, path):
        global newValue, oldValue, clients
        clients.add(websocket)
        print(len(clients), newValue, oldValue)
    
        await asyncio.gather(send(websocket), rev(websocket))  # 并发运行两个协程
    
    

    此外,你在 readLoop 函数中异步读取串口数据,但是你并没有对 newValue 进行任何修改,导致在 send 函数中 newValue 始终为初始值。你可以在 readLoop 函数中修改 newValue 的值,使其可以正确地被 send 函数使用。

    最后,你在 send 函数中使用了 websockets.broadcast(clients, newValue),但是在代码中没有看到 websockets 模块的导入。你需要在代码的开头添加 import websockets。

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

报告相同问题?

问题事件

  • 系统已结题 3月28日
  • 已采纳回答 3月20日
  • 赞助了问题酬金15元 3月13日
  • 创建了问题 3月13日

悬赏问题

  • ¥20 NRF24L01总是不在位
  • ¥15 MddBootstrapInitialize2失败
  • ¥15 LCD Flicker
  • ¥15 Spring MVC项目,访问不到相应的控制器方法
  • ¥15 esp32在micropython环境下使用ssl/tls连接mqtt服务器出现以下报错Connected on 192.168.154.223发生意外错误: 5无法连接到 MQTT 代理,如何解决?
  • ¥15 关于#genesiscsheel#的问题,如何解决?
  • ¥15 Android aidl for hal
  • ¥15 STM32CubeIDE下载程序报错
  • ¥15 微信好友如何转变为会员系统?(相关搜索:小程序)
  • ¥15 c# 直接使用c++ 类库文件