1

socket.ioブラウザで開いているすべてのタブの ID を保持するという問題を解決する方法を教えてください。

例:

ページを開いています (/indexたとえば、)。接続しsocket.ioて一意のセッション ID を取得するように設定します。しかし、別のタブで同じページを開くと、ID によって別のタブが作成されます。つまり、2 つの異なる ID を持つ 2 つの化合物が既に存在します。そうです、それは論理的です。しかし、すべてのタブ ( へのバインディングを含む) で同時にこれらの ID にメッセージを送信する必要がありuser_id、セッション ID が異なるため、不可能です。

4

2 に答える 2

7

ある種のセッション ストアを使用したくない (または使用できない) 場合で、同じ user_id を持つ複数のソケットにメッセージを送信したい場合は、user_id をキーとして、ソケットの配列を値としてマップを格納できます。

var socketMap = {};

そして、ハンドシェイクデータでソケットへの参照を保存します

io.sockets.on('connection', function (socket) {
    var userId = socket.handshake.userId;    
    if(!socketMap[userId]) socketMap[userId] = [];
    socketMap[userId].push(socket);
});

または、通常のイベント データを使用する

socket.on('auth', function(data) {
    var userId = data.userId;
    var authToken = data.authToken;
    ... // verify the data...
    if(!socketMap[userId]) socketMap[userId] = [];
    socketMap[userId].push(socket);
});

メッセージを送信するソケットのリストが必要な場合

var sockets = socketMap['some_user_id'];
于 2013-09-09T04:19:40.137 に答える
0

ソケットの ID はどのような場合でも異なるため、どのような場合でもユーザーの識別には使用しないでください。ソケット自体を識別するためにのみ使用されます。

あなたが探しているのはセッションです。ソケット接続をセッションに関連付ける機能は、あなたが探しているものです。そのためには、新しい http 接続用にセッションを作成し、socket.io のハンドシェイク プロセス中にこのセッションを復元する必要があります。そうすれば、特定のソケットが特定のセッションに属していることを識別できます。

そして、セッションに保持するユーザーデータやその他のもの。これは多くの場合に役立ちます - ページの更新時にセッションを復元したり、必要に応じて複数のタブで単一のセッションを作成したりします。

ハンドシェイク プロセスから socket.io セッション ID を復元する方法に関するこの回答をお読みください: http://www.danielbaulig.de/socket-ioexpress/

于 2013-09-06T10:09:17.900 に答える