1

ユーザーが「ルーム」を作成して参加し、コラボレーションできるようにしたいと考えています。

私はSockJs Multiplexer サーバーを見ていて、その一部を活用して特定のチャンネル/部屋を作成してブロードキャストできるかどうか疑問に思っています。

この例では、チャネルが手動で作成されクライアントがそのチャネルに接続します

これらのチャネルを部屋として扱うことはできますか?

サーバー上で手動で宣言する代わりに、これらのチャネルを動的に作成する方法はありますか?

4

1 に答える 1

3

免責事項: 私が回答を書くまで、あなたがサーバーの Javascript バージョンについて言及していることに気付きませんでした。したがって、私のコード例は Python ベースのsockjs-tornadoを使用して示されていますが、原則は同じはずです。

SockJSConnectionはい、各派生クラスで参照された接続のセットを保持することにより、チャネルを部屋として扱うことができます。これを行うには、各接続クラスをわずかに変更するだけです。

class AnnConnection(SockJSConnection):
    def on_open(self, info):
        self.send('Ann says hi!!')

    def on_message(self, message):
        self.broadcast(self.connected, 'Ann nods: ' + message)

class AnnConnection(SockJSConnection):
    connected = WeakSet()

    def on_open(self, info):
        self.connected.add(self)
        self.send('Ann says hi!!')

    def on_message(self, message):
        self.broadcast(self.connected, 'Ann nods: ' + message)

    def on_close(self):
        self.connected.remove(self)
        super(AnnConnection, self).on_close()

server.pyで。

チャネルを動的に作成するために、__main__コードとMultiplexConnectionクラスを少し変更し、いくつかの新しいクラスを追加しました。if __name__ == "__main__":ブロックでは、

# Create multiplexer
router = MultiplexConnection.get(ann=AnnConnection, bob=BobConnection,
                                 carl=CarlConnection)

に変更されました

# Create multiplexer
router = MultiplexConnection.get()

その間

class MultiplexConnection(conn.SockJSConnection):
    channels = dict()
    # …

    def on_message(self, msg):
        # …
        if chan not in self.channels:
            return

MultiplexConnectionに変更されました

class MultiplexConnection(conn.SockJSConnection):
    channels = dict()
    _channel_factory = ChannelFactory()
    # …

    def on_message(self, msg):
        # …
        if chan not in self.channels:
            self.channels[chan] = self._channel_factory(chan)

そしてクラス

class DynamicConnection(SockJSConnection):
    def on_open(self, info):
        self.connected.add(self)
        self.send('{0} says hi!!'.format(self.name))

    def on_message(self, message):
        self.broadcast(self.connected, '{0} nods: {1}'
            .format(self.name, message))

    def on_close(self):
        self.connected.remove(self)
        super(DynamicConnection, self).on_close()


class ChannelFactory(object):
    _channels = dict()

    def __call__(self, channel_name):
        if channel_name not in self._channels:
            class Channel(DynamicConnection):
                connected = WeakSet()
                name = channel_name

            self._channels[channel_name] = Channel

        return self._channels[channel_name]

Multiplex.pyに追加されました。

于 2013-05-14T09:24:42.067 に答える