You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WebSocketApp的on_message回调未触发,Wireshark可见数据包

WebSocketApp回调未触发问题排查方案

核心差异说明

WebSocketApp 是事件驱动异步模型,必须启动内置事件循环才能监听并触发回调;而 websocket.create_connection 是阻塞式同步调用,会主动轮询消息,二者运行逻辑完全不同。

常见错误点及修复方法

  • 未启动事件循环
    很多人创建了 WebSocketApp 实例后,直接调用 send() 就结束程序,没启动事件循环导致无法监听响应。正确做法是用异步线程启动 run_forever()(因为该方法是阻塞调用):

    import websocket
    import threading
    
    def on_message(ws, msg):
        print("收到响应:", msg)
    
    # 初始化WebSocketApp并绑定回调
    ws = websocket.WebSocketApp("ws://你的服务器地址", on_message=on_message)
    # 异步启动事件循环
    threading.Thread(target=ws.run_forever).start()
    
    # 发送消息
    ws.send("测试消息")
    
  • 回调函数参数错误
    回调函数的参数签名必须严格符合库要求,参数数量/顺序错了会静默失败:

    • on_message 必须接收2个参数:ws(实例)、message(消息内容)
    • on_error 必须接收2个参数:ws、error
    • on_open 必须接收1个参数:ws
  • 未处理二进制消息
    如果Wireshark显示服务器返回的是二进制帧,默认的 on_message 不会触发,需要单独注册 on_binary 回调:

    def on_binary(ws, binary_data):
        print("收到二进制响应:", binary_data)
    
    ws = websocket.WebSocketApp("ws://你的服务器地址", on_binary=on_binary)
    
  • 程序过早退出
    发送消息后程序立刻结束,事件循环还没来得及处理响应就被终止。可以在发送后添加等待逻辑:

    import time
    ws.send("测试消息")
    time.sleep(3)  # 给足够时间接收响应
    ws.close()
    

快速验证步骤

  1. 确认代码中调用了 ws.run_forever(),且用异步方式启动
  2. 核对所有回调的参数签名是否正确
  3. 根据Wireshark的帧类型,绑定对应回调(文本用on_message,二进制用on_binary)
  4. 确保发送消息后程序不会立即退出

内容的提问来源于stack exchange,提问作者Raj Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 09:42:11