Python Socket.io 处理所有事件(从客户端捕获所有事件)

Posted

技术标签:

【中文标题】Python Socket.io 处理所有事件(从客户端捕获所有事件)【英文标题】:Python Socket.io handle all events (catch all events from client) 【发布时间】:2021-03-05 20:56:24 【问题描述】:

Python Socket.io 的文档在这里:https://python-socketio.readthedocs.io/en/latest/api.html#asyncserver-class

那是服务器类,带有'event'和'on'方法来处理事件。但是,这些都是命名事件。

如何在服务器端处理来自客户端的所有事件(全部捕获)?我试过.on("*",...) 但没用,星号* 似乎只是Python socket.io 中的一个字符串。

【问题讨论】:

你在使用flask_socketio吗? 是的flask_socketio 【参考方案1】:

您可以使用AsyncNamespace class 覆盖trigger_event 方法。

将事件分派给正确的处理方法。

在最常见的用法中,这个方法不会被子类重载, 因为它执行事件到方法的路由。然而,这种方法 如果需要特殊的调度规则,可以覆盖,或者 如果 需要一个方法来捕获所有事件。

class MyCustomNamespace(socketio.AsyncNamespace):
    async def trigger_event(self, event_name, sid, *args):
        print(f"event_name=, sid=")
        if args:
            print(f"data is args[0]")


sio.register_namespace(MyCustomNamespace())

【讨论】:

【参考方案2】:

文档中似乎没有明确显示,但您可以监听 'message' 事件。像 'connect''disconnect' 一样,它是保留的,它会捕获所有传入的消息。

【讨论】:

“消息”似乎是一个正常的事件名称【参考方案3】:

似乎使用 flask_socketio 的 on("*") 事件处理程序来捕获所有未注册的事件不起作用。

我不知道它是否会破坏任何东西,但一种解决方法是访问 python-socketio 服务器对象本身,然后使用 on("*") 之类的:

@sio.server.on('*')
def catch_all(event, sid, *args):
    print(f'catch_all(event=event, sid=sid, args=args)')

【讨论】:

以上是关于Python Socket.io 处理所有事件(从客户端捕获所有事件)的主要内容,如果未能解决你的问题,请参考以下文章

如何从 socket.io 获取原生事件数组?

用 Python flask_socketio 反应 socket.io-client 不处理事件

Node.js - 如何从 app.js 外部发出 socket.io 事件?

Socket.IO处理断开事件

未处理的 socket.io 事件会发生啥?

在 Socket.io android 客户端 v1.4 中处理回调