flask-socketio和Engine.IO之间有什么关系?

时间:2018-06-20 03:44:00

标签: python flask-socketio emit

http://flask-socketio.readthedocs.io/en/latest/
emit的用法有两个描述。


flask_socketio版本

flask_socketio.emit(事件,* args,** kwargs)

  • 发出一个SocketIO事件。

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


    @socketio.on('my event')
    def handle_my_custom_event(json):
        emit('my response', {'data': 42})

参数:

  • event –要发出的用户事件的名称。
  • args –带有JSON数据的字典,作为有效载荷发送。
  • namespace –要在其下发送消息的名称空间。默认为原始事件使用的名称空间。 '/'可用于显式指定全局名称空间。
  • callback –回调函数,用于通过客户的确认进行调用。
  • 广播–将消息发送给所有客户端为True,或者为False只广播给发起事件的发送者。
  • 房间–将消息发送给给定房间中的所有用户。如果设置了此参数,则广播被暗示为True。 include_self –广播或寻址房间时包含发件人,为True;发送给除发件人以外的所有人,否则为False。 ignore_queue –仅在配置消息队列时使用。如果设置为True,则事件直接发送到客户端,而不经过队列。这效率更高,但仅在使用单个服务器进程或只有一个addresee时有效。建议始终将此参数保留为其默认值False。


Engine.io版本

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

emit(event,* args,** kwargs)

  • 发出服务器生成的SocketIO事件。

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


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

参数:

  • event –要发出的用户事件的名称。
  • args –带有JSON数据的字典,作为有效载荷发送。
  • namespace –要在其下发送消息的名称空间。默认为全局名称空间。
  • 房间–将消息发送给给定房间中的所有用户。如果不包含此参数,则将事件发送给所有连接的用户。
  • skip_sid –广播或寻址房间时要忽略的客户端会话ID。通常将其设置为邮件的始发者,以便除该客户端外的每个人都可以收到邮件。
  • 回调–如果给定,将调用此函数以确认客户端已收到消息。传递给函数的参数是客户端提供的参数。回调功能只能在寻址单个客户端时使用。

1 个答案:

答案 0 :(得分:0)

我不确定您从哪里推断出第二个功能是“ Engine.IO版本”。那是错的。您要比较的两件事都在Socket.IO包中:

  • flask_socketio.emit()
  • flask_socketio.SocketIO.emit()

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

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