2011-12-09 16 views
1

私はユーザーがログインし、すべてのページでNowJSに接続しているサイトを持っています。ほぼリアルタイムでステータス(オンライン/オフライン)を把握できるようにしたいと思いますが、これを実行する最善の方法はわかりません。私の最初の考えはconnectイベントとdisconnectイベントを使うことだけでしたが、新しいページが読み込まれるたびにソケット接続が閉じられているため、ユーザーが新しいページに行くたびに起動されるため、これは機能しません。NowJS/Node.jsを使用してオンライン/オフライン状態をリアルタイムで追跡しますか?

私は切断イベントでそのユーザーのデータベースエントリにタイムスタンプを記録し、接続イベントが発生したときに私は彼らが過去30秒以内にサイトにアクセスしたかどうかをチェックします。もしそうでなければ、私は彼らが新しいセッションを開始していると推測できます。切断イベントでは、setTimeoutを使って30秒後にオンラインになっているかどうかを確認し、そうでない場合はステータスをオフラインに設定します。

これは主に動作しますが、いくらかハッキーに見えますが、いくつかの厄介な問題があります(各ページビューで新しいタイムアウトサーバー側を使用することは問題ありません)。私はちょうど見落としているこれを行うための良い方法はありますか?

+0

新しいページ=新しいソケット接続。各ユーザーの接続を追跡し、別のソケットが開いている場合は切断を無視します。そうだね? –

+0

私は実際にそれを実際に行っていますが、ページが1つしか開いておらず、リンクをクリックしているだけでは、接続が開いていないという問題が残っています。私は現在、すべてのユーザーの接続を、名前としてユーザーIDを持つグループに保管しています。 –

答えて

0

私がやったことは、ユーザーの永続ID(この場合はMongoDBのObjectId)をキーとして保持し、値としてsetTimeoutへの参照を保持するグローバルオブジェクトを作成することでした。次に、「接続」イベントでclearTimeoutを実行し、オフラインと見なされたときにオブジェクトからキーを削除します。

0

これを行うための正しい方法は、「開いている接続があるかどうかちょうどより多くを依存します。誰かがチャットの周りにいるかどうかを他のユーザーに表示しようとしていますか?次に、ページ自体を非アクティブにするタイムアウトを検討することもできます(ユーザーがページを閉じることなくコンピュータから離れた時を把握するため)。メーターの使い方のように何か他のことをしているのであれば、別の仕組みが必要かもしれません。

+0

そうですが、それはオンラインであるかどうかを知るという中心的な機能よりも機能追加になります。例をできるだけシンプルに保つことを試みていた。 –

0

私はここで解決策がSocket.IOのタイムアウトオプションを拡張(NowJSが内部的にこれを使用しています)、またはsetTimeoutメソッドを使用してハックソリューションを使用していると思います。

正直なところ、それは、ユーザーがすぐに別のページに移動することができます考慮最善の解決策です。

+0

socket.ioには、一定期間が経過するまでサーバー上で切断イベントを発生させない方法がありますか? –

+1

はい、ハートビートタイムアウトと近いタイムアウトのparamsでここhttps://github.com/LearnBoost/Socket.IO/wiki/Configuring-Socket.IO見えます。 – alessioalex

+0

これらのデフォルトはそれぞれ15秒と25秒です。私が何かが欠けていない限り、残念なことにそのトリックはありません。 –

関連する問題