リアルタイムのWebアプリケーションを構築しています。Pythonアプリケーションのサーバー側の実装からブロードキャストメッセージを送信できるようにしたい。
設定は次のとおりです。
- クライアント側のsocketio.js
- Socket.IOサーバーとしてのTornadIO2サーバー
- サーバー側のPython ( Djangoフレームワーク)
クライアントからサーバーにsocket.ioメッセージを正常に送信できます。サーバーはこれらを処理し、応答を送信できます。以下では、私がそれをどのように行ったかについて説明します。
現在の設定とコード
まず、socket.ioイベントを処理する接続を定義する必要があります。
class BaseConnection(tornadio2.SocketConnection):
def on_message(self, message):
pass
# will be run if client uses socket.emit('connect', username)
@event
def connect(self, username):
# send answer to client which will be handled by socket.on('log', function)
self.emit('log', 'hello ' + username)
サーバーの起動は、Django管理カスタムメソッドによって行われます。
class Command(BaseCommand):
args = ''
help = 'Starts the TornadIO2 server for handling socket.io connections'
def handle(self, *args, **kwargs):
autoreload.main(self.run, args, kwargs)
def run(self, *args, **kwargs):
port = settings.SOCKETIO_PORT
router = tornadio2.TornadioRouter(BaseConnection)
application = tornado.web.Application(
router.urls,
socket_io_port = port
)
print 'Starting socket.io server on port %s' % port
server = SocketServer(application)
非常によく、サーバーは今実行されます。クライアントコードを追加しましょう:
<script type="text/javascript">
var sio = io.connect('localhost:9000');
sio.on('connect', function(data) {
console.log('connected');
sio.emit('connect', '{{ user.username }}');
});
sio.on('log', function(data) {
console.log("log: " + data);
});
</script>
明らかに{{ user.username }}
、現在ログインしているユーザーのユーザー名に置き換えられます。この例では、ユーザー名は「alp」です。
これで、ページが更新されるたびに、コンソールの出力は次のようになります。
connected
log: hello alp
したがって、メッセージの呼び出しと応答の送信は機能します。しかし、ここで注意が必要な部分があります。
問題
応答「helloalp」は、socket.ioメッセージの呼び出し元にのみ送信されます。接続されているすべてのクライアントにメッセージをブロードキャストして、新しいユーザーがパーティーに参加した場合にリアルタイムで通知できるようにします(チャットアプリケーションなど)。
だから、ここに私の質問があります:
接続されているすべてのクライアントにブロードキャストメッセージを送信するにはどうすればよいですか?
特定のチャネルでサブスクライブされている複数の接続されたクライアントにブロードキャストメッセージを送信するにはどうすればよいですか?
BaseConnection
Pythonコードのどこにでも(クラス外で)ブロードキャストメッセージを送信するにはどうすればよいですか?これにはPython用のSocket.IOクライアントが必要ですか、それともTornadIO2が組み込まれていますか?
これらのブロードキャストはすべて信頼できる方法で行われる必要があるため、WebSocketが最良の選択だと思います。しかし、私はすべての良い解決策を受け入れています。