24

socket.ioに問題があり、解決方法がわかりません。ユーザーインタラクションを管理するためのsocket.ioを備えたログインシステムを備えたアプリがあります。また、すべてのアクティブなWebSocketセッションを管理するための配列があります。この配列は、ペアsession.id=>usernameを格納します。

問題は、ユーザーが同じページ(またはWebSocketを使用する別のページ)で新しいタブを開いたときに始まります。これにより、配列内のユーザー名エントリが重複します。

{id1, username}
{id2, username}

ソケットがユーザーにメッセージを送信するとき、ソケットは配列の最初のセッションIDにのみ送信するため、1つのタブのみがメッセージを受信します。

新しい接続のソケットIDを他の接続と一致するように変更しようとしましたが、機能しません。

socket.id = sessionId of the other websocket;

別の解決策は、開いているすべてのセッションにメッセージを送信することだと思いますが、それは最善の方法ではないと思います。

ありがとう。

4

4 に答える 4

31

セッションIDではなく、質問でソケットIDを参照しているようです。高速セッションがある場合は、セッション ID を使用できます。セッション ID は、同じブラウザーを使用し、「プライベート」モードでない限り、開いているタブの数に関係なく同じになります。socket.io でセッションを有効にする方法については、この質問をご覧ください。

socket.io とセッション?

更新: セッション ID を保存するときは、それをユーザーのニックネームと接続されているソケットに関連付けます。次に、各ソケットを反復処理してメッセージを送信できます。次のようなもの:

[
    {sessionId: '12345', nickname: 'timmay!', socketIds: [1, 2, 3]},
    {sessionId: '23456', nickname: 'pete', socketIds: [4, 5, 6]}
]

別の接続が確立されたら、新しいソケット ID を socketIds 配列にプッシュし、ユーザーが切断すると ID を削除します。

別のオプションは、セッションごとにユーザーごとに 1 つのタブのみを許可することです。単一の socketId を格納でき、同じユーザーに対して新しいソケットが接続されたときに、元のソケットを切断して、代わりに新しいソケットを使用できます。

于 2012-08-28T19:32:08.423 に答える