web-dev-qa-db-ja.com

ユーザーの接続が失われたこと、またはユーザーがNodejs socket.ioのブラウザーウィンドウを閉じたことを検出する方法

Node.jsとSocket.ioにチャットアプリケーションがあります。ユーザーはボタンで接続および切断できます...ユーザーがトリガーする定義済みイベントの助けを借りて完全に管理されるオンラインユーザーのリストがあります。

しかし、問題は、ユーザーが手動で切断する(切断ボタンによる)ことなく、ユーザーが接続を失ったか、ブラウザーウィンドウを閉じたかどうかを検出できないことです...

このsocket.ioイベントは、ユーザーが接続を失ったときではなく、ユーザーが自分を切断したときにのみ発生します。

socket.on('disconnect',function(){
   console.log('user disconnected');  });

オンラインユーザーリストを更新するために、ユーザーから目を離さないようにするための本当に優れたメカニズムが必要です。

14
TaLha Khan

そして、違いは何ですか?ウィンドウを閉じて、イーサネットワイヤーを切断します...サーバーについても、接続の終了と同じです。

Socket.ioドキュメントを読む: https://github.com/LearnBoost/socket.io/wiki/Exposed-events

socket.on( 'disconnect'、function(){})-切断イベントは、クライアント/サーバー接続が閉じられると、すべての場合に発生します。それは、望まれた、望まれていない、モバイル、非モバイル、クライアントとサーバーの切断で発火します。

人々はそのボタンを使用せずに切断できるので、ボタンに依存するべきではありません。切断イベントを使用し、ソケットが切断すると(ユーザーではなくソケット、原因Nodeはソケットについて知っているだけです)、そのソケットの「所有者」とフラグを知っている必要があります。 「切断済み」と表示します。さらに、数秒待ってからオフラインとしてフラグを立てます。理由は、ユーザーがページをリロードしたり、別のページに移動したりしても、切断イベントがトリガーされるためです。数秒後、ユーザーは再びオンラインになります。

私もこの問題を抱えていて、X秒ごとに実行され、ユーザーがソケットを所有していない場合や離れているように見える場合(長時間アクティビティがない場合)にユーザーにオフラインのフラグを付ける「ウォッチャー」を作成することになりました。

18
Salvatorelab