16

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

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

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

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

オンライン ユーザー リストを更新するために、ユーザーを監視する優れたメカニズムが必要です。

4

1 に答える 1

18

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

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

socket.on('disconnect', function() {}) - クライアントとサーバーの接続が閉じられると、あらゆる場合に切断イベントが発生します。必要な、不要な、モバイル、非モバイル、クライアントとサーバーの切断で起動します。

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

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

于 2013-04-30T07:34:07.957 に答える