2016-07-27 61 views

回答

0

如果您想要實際的服務器推送,那麼您將需要webSocket或服務器發送的事件。由於服務器發送的事件是非常新的(並且在很多瀏覽器中不支持),所以實際服務器推送的主要選項是webSocket連接。

在webSocket架構中,客戶端連接到服務器,然後保持連接狀態。這允許服務器隨時通過該連接向客戶端發送數據。

服務器發送的事件是一個類似的體系結構,但具體使用方式不同。


沒有辦法在實際的服務器推送中使用Ajax。有時使用Ajax通過使用通常稱爲長輪詢的方式模擬服務器發送的事件。在這種情況下,客戶端發起Ajax調用,服務器暫時掛在Ajax請求上,而不是立即返回響應。如果服務器端事件在此期間到達,則服務器可以接收等待響應的連接併發送響應。客戶端將得到響應,處理它,然後進行另一個Ajax調用。在長時間輪詢中,如果稍後沒有發生服務器端操作,則Ajax調用超時,客戶端必須啓動新的連接。

長輪詢的整個連接序列的效率通常低於webSocket連接。因此,如果您要解決的主要問題是服務器推送,那麼webSocket連接可能是最有效的方式,並得到廣泛支持。

下面是一些類似的問題和答案,其中包含更多的討論:websocket vs rest API for real time data?Ajax vs Socket.io

+0

只是額外的貢獻:所有瀏覽器都支持除IE以外的SSE,但您可以使用現有庫爲SSE提供基本支持。 當通信在一個方向(服務器到客戶端)時,我總是會選擇SSE,因爲它更容易實現,而且您不必關心連接失敗和處理重新連接。 如果您使用java,也許這是有用的:https://github.com/mariomac/jeasse – Mario

+0

謝謝!我正在努力實現web-sockets現在,但我想看看SSE,你知道任何教程使用python/Tornado嗎? –