如何从非SocketIO请求广播到所有连接的SocketiO客户端?

时间:2015-02-24 22:35:51

标签: python flask socket.io gevent-socketio

我正在运行SocketIO服务器,例如:

from socketio.server import SocketIOServer
server = SocketIOServer(
   ('127.0.0.1', '8000'),
   resource='socket.io',
)
server.serve_forever()

然后我有一个命名空间:

class Foo(BaseNamespace, BroadcastMixin):
    def on_msg(self, data):
        self.emit(data['msg'])

最后,我有一条路线,如:

module = Blueprint('web', __name__)
@module.route('/')
def index():
    pkt = dict(
              type='event',
              name='new_visitor',
              endpoint='/foo'
           )

    ## HERE: How do I get the "socket" to look through each connection
    #for sessid, socket in blah.socket.server.sockets.iteritems():
    #    socket.send_packet(pkt)

    return render_template('index.html')

所以,上面评论的部分是我遇到问题的地方。

到目前为止我做了什么:

  • 我潜入gevent-socketio code并看到那里的插座被跟踪。但我不确定下一步会是什么。
  • 注意到,在Flask中,request.environ具有与该对象对应的socketio值。但是,这仅限于SocketIO请求。

非常感谢任何线索或提示。

1 个答案:

答案 0 :(得分:0)

我在Flask-SocketIO扩展上使用的代码是你想做的:

def emit(self, event, *args, **kwargs):
    ns_name = kwargs.pop('namespace', '')
    for sessid, socket in self.server.sockets.items():
        if socket.active_ns.get(ns_name):
            socket[ns_name].emit(event, *args, **kwargs)

我的实际实现有点复杂,我简化它只是为了展示如何做你所要求的。如果您想查看完整代码,则扩展程序位于github