私はnodejsを初めて使用していて、socket.ioを試していました。特定のソケットにメッセージを送信しようとしているので、ソケットへの参照を格納すると思っていました。Socket.IOのソケットリファレンス
var controls = {};
var clients = {};
var control = io
.of("/control")
.on("connection", function(socket){
socket.on("connect_player", function(data){
var id = data.screen_id;
controls[socket.id] = id;
});
socket.on("msg", function(data){
id = controls[socket.id]
player.socket(clients[id]).emit("msg", data);
});
});
var player = io
.of("/player")
.on("connection", function(socket){
socket.on("set_id", function(id){
clients[id] = socket.id
});
});
まず、「プレーヤー」名前空間に接続し、ID(ハードコード)を表示するWebページを開始します。次に、playerと同じidを持つ "control"ネームスペースに接続する別のWebページが、コントローラはその特定のプレーヤーにメッセージを送信できるはずですが、これはしばらくの間動作してから失敗します。
期間中、コントロールページから特定のプレイヤーページにメッセージを送信できます。
プレイヤーネームスペース内のソケットIDが動作を停止した後に調べられ、ソケットIDが初期のものと異なることがわかりました。
私はここで何か間違っていると思いますが、コンセプトを間違って理解しています。どうすればこの問題を解決できますか。
編集:
私は「再接続」イベントのリスナーを追加し、それぞれの「再接続」イベント後のsocket.idの値が変化することがわかりました。したがって、コントロールとクライアントには問題がある無効なsocket.id値があります。これを克服するために遠く離れていますか?
私は自分の質問を編集しました。私が直面している問題は、再接続後に変更されるような参照としてsocket.idを使用しているという事実によるものです。 – Josnidhin
正確です。だからこそ私はそれを使わないというアドバイスをしている。各クライアントのために独自のIDを定義して設定し、プライベートメッセージングを維持するために部屋を使用します。 – freakish
私の経験では、 "部屋"機能を使用するにはRedisStoreを使用する必要があります。 Socket.ioはRedisの購読を利用して「部屋」を実装するための登録解除機能 – InspiredJW