2016-04-05 56 views
1

我目前正在研究一個聊天系統,僅僅是作爲一名程序員改善自己的一種手段,因爲我還年輕(17)。當用戶登錄時,消息「{user}已進入聊天。」在聊天中顯示。同樣,當用戶註銷時,消息「{user}已離開聊天。」顯示。如何確定用戶何時正式離開或進入一個頁面

這兩個功能按原樣正常工作。但是,我還想確定用戶什麼時候關閉了頁面(留言)和何時回來(輸入留言)。

爲了在一定程度上做到這一點,我做了以下內容:

1,在主聊天頁面(chat.php),我設置了一個名爲onpage

2會話,當用戶離開頁面,下面的腳本將在onbeforeunload事件通過AJAX(jQuery的)運行:

//setoffline.php 

    unset($_SESSION["onpage"]); // unset the session 
    if ($_POST['logout'] == "false") { // in our case, this will evaluate true 
     sleep(3); // halt the script for 3 seconds 
     if (isset($_SESSION["onpage"]) || !empty($_SESSION["onpage"])) 
      die(); 
     } 
    } 
    // if continued, send the offline message 
    ... 
    $_SESSION["left"] = "true"; 

3,運行該腳本,然後檢查是否會仍然存在(若用戶提供三種內返回之前睡三秒鐘秒會話將被重置)。如果不是,則腳本將完成,發送留言信息,並設置會話left

4,當用戶返回時,會觸發一個onload函數來檢查會話left。如果已設置,則會發送輸入消息,會話left將被取消設置。

的問題:

到現在爲止,我相信你已經確定了一個問題,我的算法。我自己也看到很多問題。例如,使用sleep函數看起來不正確,也不能正常工作。它在關閉頁面時正常工作(因爲沒有人在3秒內返回),但是當你刷新時,它會導致頁面暫停三秒鐘,我不想要。我只想要一種方法來識別用戶何時正式離開並共軛返回到頁面。

+0

您是否知道每個用戶都有自己的會話? – delueg

+0

這不是問題。如果用戶關閉該頁面,每個用戶都有自己的會話幫助的事實將如何通知我用戶已經離開聊天? @delueg – Shawn31313

+0

當新的聊天消息進入時,你如何更新瀏覽器?某種投票?也許輪詢數據也可能返回登錄到聊天的用戶列表。然後你可以查看哪些人已經離開了聊天。 (使用onbeforeunload發送命令以將用戶註銷或將其標記爲已離開聊天)。 –

回答

1

最好的解決方案是每5或10秒鐘撥打一次AJAX呼叫服務器。這個AJAX請求將改變服務器DB上的最後一個在線狀態(日期時間),這個狀態就是在瀏覽器中打開頁面的每個用戶。

如果他離開頁面,什麼也不做。在這種情況下,AJAX請求將不會被調用,並且上次在線時間不會更新。

另一方面,您顯示該用戶已聯機並已脫機。這是另一個Ajax請求(每5或10秒)從服務器獲取數據,這會在5或10秒前確定誰在線。根據用戶過去的統計數據和當前的統計數據,您可以確定每個用戶的在線/離線狀態。

希望你能理解。

0

正如另一個答案中提到的一樣,每個客戶端都會以某個設定的間隔輪詢服務器。然後,服務器會假定最近沒有輪詢的任何客戶已經「離開」了。這種方法的一個巨大缺點是它使用了很多帶寬。

另一種方法是將確定何時顯示消息的邏輯移動到每個客戶端。當用戶離開房間時,服務器以某種方式通知房間中的其他人已經離開了該房間。客戶端可以使用setTimeout,而不是客戶端立即顯示該消息,然後檢查服務器是否發送了另一條消息,說明同一用戶回到房間。您可以在與用戶關聯的某個HTML塊上使用data屬性來記錄它可能已經離開並且已經返回。


至於如何保持各種客戶端,我會建議尋找到一個名爲BOSH技術的服務器之間的連接。

​​爲BOSH提供了一個非常好的介紹,以及它爲什麼比其他替代品更好,比如不斷「輪詢」服務器。

相關問題