2012-03-12 1 views
1

私は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値があります。これを克服するために遠く離れていますか?

答えて

4

としてハートビート間隔を設定してみてくださいでした。それではどうですか?接続ごとに、この接続の一意のIDを設定します(たとえば、一意のユーザー名 - これはセッションと一緒にすばらしいやり方です)。そして、あなたは、あなたがmsgハンドラに次の操作を行うことができます

io.on('connection', function(socket) { 
    // retrieve the ID from socket 
    socket.join('/priv/'+ID); 
}); 

を使用することができます。

// get the ID 
io.sockets.in('/priv/'+ID).emit("msg", data); 

この時点では、メッセージは、あなたがしたいユーザーに行ったことを確認することができます。もちろん、クライアントの再接続時にIDが変更されないようにする必要があります。前にも触れましたが、セッションクッキーをサーバーに送信し、セッションからIDを取得することでこれを行うことができます。

クライアントが何度も再接続する可能性があり、他のクライアントがこの特定のクライアントをたとえば(一意の)名前で再確認することが望ましいため、これが唯一の解決策です。

+0

私は自分の質問を編集しました。私が直面している問題は、再接続後に変更されるような参照としてsocket.idを使用しているという事実によるものです。 – Josnidhin

+0

正確です。だからこそ私はそれを使わないというアドバイスをしている。各クライアントのために独自のIDを定義して設定し、プライベートメッセージングを維持するために部屋を使用します。 – freakish

+0

私の経験では、 "部屋"機能を使用するにはRedisStoreを使用する必要があります。 Socket.ioはRedisの購読を利用して「部屋」を実装するための登録解除機能 – InspiredJW

1

あなたが最新socket.ioは部屋をサポート

io.set('heartbeat interval', 20); 
io.set('heartbeat timeout', 60); 
+0

私はこれが私を助けるとは思わない。私はそれを試して何も変わっていない。提案していただきありがとうございます。 – Josnidhin

+0

どのバージョンのsocket.ioを使用していますか? – almypal

+0

最新バージョンv0.9 – Josnidhin