ユーザーが「ルーム」を作成して参加し、コラボレーションできるようにしたいと考えています。
私はSockJs Multiplexer サーバーを見ていて、その一部を活用して特定のチャンネル/部屋を作成してブロードキャストできるかどうか疑問に思っています。
この例では、チャネルが手動で作成され、クライアントがそのチャネルに接続します。
これらのチャネルを部屋として扱うことはできますか?
サーバー上で手動で宣言する代わりに、これらのチャネルを動的に作成する方法はありますか?
ユーザーが「ルーム」を作成して参加し、コラボレーションできるようにしたいと考えています。
私はSockJs Multiplexer サーバーを見ていて、その一部を活用して特定のチャンネル/部屋を作成してブロードキャストできるかどうか疑問に思っています。
この例では、チャネルが手動で作成され、クライアントがそのチャネルに接続します。
これらのチャネルを部屋として扱うことはできますか?
サーバー上で手動で宣言する代わりに、これらのチャネルを動的に作成する方法はありますか?
免責事項: 私が回答を書くまで、あなたがサーバーの 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()
チャネルを動的に作成するために、__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に追加されました。