1

我正在运行 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 代码,发现套接字在那里被跟踪。但我不确定下一步会是什么。
  • 注意到,在 Flask 中,request.environ有一个socketio对应于对象的值。但是,这仅适用于 SocketIO 请求。

任何线索或提示将不胜感激。

4

1 回答 1

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上。

于 2015-02-27T07:10:10.297 回答