Python 什么';It’Etio和Engine.IO之间的关系是什么?

Python 什么';It’Etio和Engine.IO之间的关系是什么?,python,flask-socketio,emit,Python,Flask Socketio,Emit,关于emit如何使用,有两种描述。 flask_socketio版本 烧瓶_socketio.emit(事件,*args,**kwargs) 发出SocketIO事件 此函数将向一个或多个连接的客户端发出SocketIO事件。JSON blob可以作为有效负载附加到事件。这是一个只能从SocketIO事件处理程序调用的函数,如从当前客户端上下文获取一些信息。例如: @socketio.on(“我的活动”) def处理我的自定义事件(json): emit('my response',{'d


关于
emit
如何使用,有两种描述。

flask_socketio版本

烧瓶_socketio.emit(事件,*args,**kwargs)
  • 发出SocketIO事件

  • 此函数将向一个或多个连接的客户端发出SocketIO事件。JSON blob可以作为有效负载附加到事件。这是一个只能从SocketIO事件处理程序调用的函数,如从当前客户端上下文获取一些信息。例如:

@socketio.on(“我的活动”) def处理我的自定义事件(json): emit('my response',{'data':42}) 参数:
  • event–要发出的用户事件的名称
  • args–包含要作为有效负载发送的JSON数据的字典
  • namespace–要在其下发送消息的命名空间。默认为原始事件使用的命名空间。“/”可用于显式指定全局命名空间
  • callback–通过客户端确认调用的回调函数
  • 广播–True将消息发送给所有客户端,或False仅回复发起事件的发件人
  • 房间–将消息发送给给定房间中的所有用户。如果设置了此参数,则表示广播为True。 include_self–True表示在广播或寻址房间时包含发件人,False表示发送给发件人以外的所有人。 忽略队列–仅在配置消息队列时使用。如果设置为True,事件将直接发送到客户端,而不经过队列。这更有效,但仅在使用单个服务器进程或存在单个addresee时有效。建议始终将此参数的默认值保留为False。

Engine.io版本

Engine.IO服务器配置支持以下设置:

发射(事件,*args,**kwargs)
  • 发出服务器生成的SocketIO事件

  • 此函数将向一个或多个连接的客户端发出SocketIO事件。JSON blob可以作为有效负载附加到事件。此函数可在SocketIO事件上下文之外使用,因此当服务器是事件的发起人时,在任何客户端上下文之外(例如在常规HTTP请求处理程序或后台任务中)使用此函数是合适的。例如:

@应用程序路径(“/ping”) 定义ping(): emit('ping事件',{'data':42},命名空间='/chat') 参数:
  • event–要发出的用户事件的名称
  • args–包含要作为有效负载发送的JSON数据的字典
  • namespace–要在其下发送消息的命名空间。默认为全局命名空间
  • 房间–将消息发送给给定房间中的所有用户。如果未包含此参数,则将事件发送给所有连接的用户
  • skip_sid–在广播或寻址房间时要忽略的客户端会话id。这通常设置为消息的发起人,以便除该客户端之外的所有人都接收消息
  • 回调–如果给定,将调用此函数以确认客户端已收到消息。将传递给函数的参数是客户端提供的参数。回调函数只能在寻址单个客户端时使用

我不确定您从何处推断出第二个函数是“Engine.IO版本”。这是错误的。您要比较的两件事都在Socket.IO包中:

  • 烧瓶_socketio.emit()
  • 烧瓶_socketio.socketio.emit()
这两者之间的区别只是前者是一种“上下文感知”功能,而后者则不是。两者都发送一个Socket.IO事件,但对于第一个事件,将从Flask请求上下文中提取一个默认收件人和命名空间,因此您只能在上下文可用时使用它。对于第二个,您需要自己提供收件人和名称空间

我不知道您为什么在本次讨论中引入Engine.IO。这是一个较低级别的通信协议,Socket.IO构建在该协议之上。它实际上比Socket.IO简单得多,只能将消息从服务器发送到单个客户端,或从客户端发送到服务器。不支持名称空间、房间、广播等

@socketio.on('my event') def handle_my_custom_event(json): emit('my response', {'data': 42}) @app.route('/ping') def ping(): socketio.emit('ping event', {'data': 42}, namespace='/chat')