2013-08-29 51 views
1

我正在使用Node.js(Express框架)和socket.io做一個實時網站,在某些時候它必須檢測某人是否在線(這基本上是如果有人打開網頁)。Facebook如何知道某人是否在線

我認爲Facebook聊天就是這樣的一個例子。但是它背後的工程邏輯是什麼?

非常感謝!

+0

您使用何種形式的用戶認證? –

+0

這是在登錄頁面之後。在登錄頁面這是一個標準POST請求發送到服務器進行數據庫用戶認證 –

回答

0

不確定Facebook是如何做到這一點的,但是如果您向擁有javascript的用戶提供頁面,這會使得每隔一分鐘就會以特定間隔發出異步請求。然後,當您收到一個請求時,用戶將被標記爲在線,超時時間稍長於ajax時間間隔。如果超時沒有另一個Ajax請求,則用戶標記爲離線。

您可能會掛鉤頁面加載和頁面關閉事件,以便只在用戶加載頁面或離開頁面時發送請求。這將需要較少的請求。

編輯

我你使用套接字IO我不是超級熟悉,但我想你可以使用所提供的插座連接/斷開事件看。

+0

感謝您的答案。我目前正在使用頁面加載/關閉事件,但當用戶在多個選項卡中打開網頁時會變得雜亂無章。它也可以搞砸,當用戶保持按F5瘋狂 –

+0

你好,我想頁面關閉事件會導致多個選項卡的問題。 http://stackoverflow.com/questions/12166187/manage-multiple-tabs-but-same-user-in-socket-io這可能會幫助 – djbrick

+0

http://stackoverflow.com/questions/1051895/whats-the-easiest -way-to-determine-is-a-user-in-online-php-mysql在一個時間間隔上進行ping操作似乎是一種常見的解決方案 – djbrick

0

客戶端定期向服務器發送保持活動消息,在客戶端JS中實現。

如果服務器在某個超時期間內未收到保持活動狀態,則可以將該用戶標記爲離線。它也可以在websocket明確關閉時這樣做。

相關問題