ユーザーが「ルーム」を作成して参加し、コラボレーションできるようにしたいと考えています。
私は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に追加されました。