如何在瀏覽器中顯示連續的實時更新,如facebook ticker,meetup.com主頁呢?在python,PHP,node.js中,服務器端會對性能產生什麼影響? 另外,如果頁面被像akamai這樣的CDN緩存,我們如何才能實現同樣的更新?如何顯示像facebook ticker,meetup.com主頁那樣的連續實時更新?
回答
你有兩個選擇(其他人已經在上面詳細說明)。如果你不熟悉每個選項背後的一些概念性想法,我想我會給他們一兩行。請注意,我正在以非常非常高的級別呈現這些概念。
你三個選項:
- 短輪詢
- web套接字
- 彗星/長輪詢
短輪詢
短輪詢克服了一個通過強制執行Client-Server之間的通信客戶端連續發送請求到窗體的服務器:
Client: Do you have a message for me?
Server: No.
Client: (wait x seconds)
Client: Do you have a message for me?
Server: No.
Client: (wait x seconds)
Client: Do you have a message for me?
Server: Yes. Here it is!
Client: Yay!
Client: (update message)
代表客戶的不斷嘮叨稱爲輪詢。爲了實現這個結構,您需要設置您的服務器以「偵聽」來自客戶端的這些輪詢請求。服務器還必須在某處存儲這些消息,以便在消息準備就緒時,服務器可以提供它們。在一個非常高的一個簡單的層面,你的服務器需要:
- 接受一般的網頁請求
- 接受查詢請求
- 是獲取信息
- 存儲這些信息運行後臺作業的地方,這樣,當輪詢請求進來,服務器可以檢查它們。
你還需要這些輪詢請求配合某種會話ID的用戶,讓正確的信息到達合適的人。總體而言,這種範式很複雜,在我看來,效率低下。
Web套接字
Web套接字是HTML5的新功能。他們背後的基本想法是,客戶可以維持到服務器的直接連接,他們可以推信息來回對方。因此,而不是通常的:客戶端發送GET請求>>服務器與內容進行響應,網絡套接字讓你保持一個持續的對話。
爲了對此進行設置,但是,您需要:
- 瀏覽器是兼容的WebSocket(不是全部都是)。
- ,可以處理網絡套接字的服務器(不知道如何表達這一點,但不是所有的服務器都設置了這樣的安排)。
的設置有些複雜,雖然比長輪詢簡單:
- 客戶端保持連接到基於Web的插座連接到服務器
- 服務器推動通過web套接字 結果給客戶
- 客戶端根據結果更新頁面
您好拭目以待簡稱爲推送通知這種模式(當然,如果你擁有一部iPhone,你已經經歷了這一點)作爲服務器已授權推「東西」到客戶端(如何不禮貌!)。由於有大量的客戶端和服務器的細微差別,我會建議測試出像Pusher,這基本上是一個Web服務來處理網絡套接字的所有困難的部分。在開始自己設置模式之前,這將是一個簡單的方式讓您測試和使用模式。它有客戶端和服務器端的庫。
希望這些信息給你一個基準來解決問題。其他答案有關如何解決每種情況的更直接信息。
彗星/長輪詢
一種替代,看似跨瀏覽器的方法來網絡套接字是長輪詢(見Comet)。在這種情況下,客戶端建立到服務器的連接並掛起,等待數據被推回。此安裝程序是有些複雜,但它確實代表短輪詢和網絡套接字之間的中間地帶。
您可以使用民意調查,長時間民意調查或如果您想推送系統。最容易的是投票。但是,所有解決方案都需要客戶端編碼。
性能影響取決於您的解決方案。最容易實施將是一次民意調查。頻率很低的一次調查確實有效地提出了一個請求,比如100ms模擬實時。長期民意調查的影響較小,但在一段或多或少的時間內會持續開放很多請求。
我建議使用SockJS或Socket.io作爲客戶端JavaScript庫,然後在服務器端使用Tornado將任何狀態更改發佈到客戶端來實現類似連接的套接字。代碼非常簡單。
客戶端代碼取決於您選擇的庫。 SockJS或SocketIO。或者,如果你只是想使用WebSockets直接這很簡單:
update_socket = new WebSocket("ws://my_server.com/listening_url");
update_socket.onmessage = function (evt) {
$("#my_div").html(evt);
};
服務器端代碼也很簡單:
import tornado
class UpdateHandler(tornado.websocket.WebSocketHandler):
def open(self):
self.write_message('Hi client')
# listen for some events that are occurring
for message in function_that_generates_events():
self.write(message)
def on_message(self, message):
# Do something with incoming messages
def on_close(self):
# tidy up
app = tornado.web.Application(('r/listening_url',UpdateHandler))
app.listen(9000)
- 1. facebook ticker設計是如何實現的?
- 2. 實時更新的持續連接
- 3. 實時更新連續功能
- 4. 如何實現像Facebook一樣的自動應用更新?
- 5. Mysql:如何顯示實時顯示新插入和表更新?
- 6. 像facebook的主頁一樣傳呼
- 7. 如何連續延時顯示標籤
- 8. 像FourSquare那種連續居留制更新
- 9. 像Twitter一樣的實時更新
- 10. 如何驗證與App連接的Facebook頁面的實時更新?
- 11. Facebook實時更新
- 12. Facebook實時更新
- 13. 實時更新Facebook頁面藍調
- 14. Facebook實時更新:訂閱頁面
- 15. 如何使用實時數據連續更新折線圖
- 16. 如何更新網頁內容像facebook新聞提要更新
- 17. 如何測試Facebook實時更新
- 18. Facebook的實時更新
- 19. 實時更新的Facebook
- 20. Livestream表不會像它應該更新的那樣更新
- 21. 如何在網頁上顯示像圖像一樣的圖像
- 22. 用XML文件連續更新網頁
- 23. 如何應用由於像facebook那樣溢出自動顯示的水平條的樣式
- 24. 如何像facebook home feed一樣獲取Google Plus主頁Feed?
- 25. 如何更新Facebook頁面?
- 26. 如何顯示發佈更新時間,如Facebook和Twitter?
- 27. Facebook Graph API會顯示實時更新嗎?
- 28. 顯示像facebook/iphone這樣的滑動網頁跳板
- 29. 更新datagridview的。(顯示實時數據)
- 30. 如何在主窗口中實時顯示攝像機視圖?