2009-06-08 99 views
2

什麼是最好的方式來實現多個事物的服務器推送。如何一次實現服務器推送更多值?

可以說我只想更新用戶狀態,所以我可以週期性地輪詢服務器狀態1000毫秒並更新頁面。

我發現的另一種方式是,服務器等待30秒,同時檢查是否有任何變化,如果發現有變化,服務器將響應推回客戶端,然後再更新頁面,然後再進行輪詢。

但我該如何執行此檢查網站上的10件事情?例如,如果我想的StackOverflow刷新問題投票時,有人投票,但如何做到這一點,我能想到的唯一的辦法就是

要求服務器票每個問題 - >服務器的每一個問題的投票回覆在頁面上

但是我怎樣才能找出哪些問題投票確實發生了變化?我可以發送所有當前的投票,然後讓服務器比較這些值並僅回覆那些確實發生變化的投票,但我認爲在檢查類似30個值時這樣做會非常無效。

一個例子是Facebook,其中幾乎所有的東西都被服務器推送刷新,但服務器如何才能找出什麼改變了,什麼沒有改變?我發現的一切(包括我的書「Ajax Patterns」)只解釋瞭如何輪詢一個值,但我沒有發現如何一次輪詢許多值(如超過10)。

回答

2

如果您準備使用會話,最簡單的方法是獲得一個串行請求ID,並讓服務器跟蹤在會話中發送給客戶端的最新信息。然後客戶詢問是否有比上次刷新更新的數據。

例如:假設客戶端發送一個Ajax請求#5001後沒有任何變化,服務器可能會回覆'假'。然後有人發佈消息,或者有某種改變,因此在請求#5002中,服務器發送一個更改元素的列表(不管它們是什麼)。然後在請求#5003中,它會再次回覆錯誤,因爲請求#5002後沒有任何變化。

JSON客戶端/服務器體系結構對此非常完美。它可以輕鬆實現對象層次結構/地圖的序列化。我更喜歡jQuery的客戶端在JavaScript中,服務器端是微不足道的吐出來。

+0

但服務器如何知道某些更改?我能想到的唯一方法是記錄所有的變化,然後回覆客戶端沒有的所有內容......如果客戶端有#5000,那麼另外兩個人「添加註釋」,所以它的#5002,以及何時第一次客戶端調查新聞,服務器必須從#5000開始獲得所有更改,但不是不那麼有效? – 2009-06-08 23:08:41

0

我建議在服務器端用修訂號標記數據,這樣客戶端就知道它有哪些數據修訂;創建一個複合查詢,客戶端可以發送一組修訂版本,服務器可以使用任何更新版本的修訂版來響應修訂版列表。這樣,客戶端只做一個服務器查詢來查看是否有更新;你只需把客戶感興趣的所有數據拼湊成一個查詢。這種方法還具有允許客戶更改其感興趣的數據集的優勢;如果您的實現服務器端足夠靈活,則可以針對所有動態數據需求使用相同的實現。

相關問題