2011-04-25 60 views
3

在Facebook上。當有人向你發送消息時,你會收到通知。這是在用戶不做任何事情的情況下完成的它是如何觸發的?Facebook中的通知

我可以用jsp,jQuery - ajax來實現嗎?

這怎麼可能。因爲我通常按鍵操作或用戶刷新其瀏覽器。你怎麼知道你什麼時候收到消息?

回答

2

服務器向客戶端發送消息有很多方法。有些是:

  • 「彗星」,其中XmlHttpRequestonreadystatechange是(AB)用於允許服務器‘流’事件,通知,以及瀏覽器等實時數據。現在這已被棄用,但是是最兼容的方法。請參閱http://en.wikipedia.org/wiki/Comet_(programming))
  • WebSockets,它允許與HTML5兼容的瀏覽器和適當的Web服務器建立雙向套接字。請參閱http://en.wikipedia.org/wiki/WebSockets
  • 服務器發送的事件,如WebSockets,並且僅在某些瀏覽器中可用。這些與WebSocket不同,不需要專門的Web服務器,但只允許服務器將事件推送到瀏覽器,反之亦然。見http://en.wikipedia.org/wiki/Server-sent_events

我會建議使用jQuery插件EventSource的,可用時使用服務器發送的事件,而當無法使用,回落到彗星:https://github.com/rwldrn/jquery.eventsource

+0

如果您可以在服務器上安裝軟件,我只能推薦您使用[APE(Ajax Push Engine )](http://www.ape-project.org/),它提供了一個用C語言編寫的真正可擴展的實時服務器,以及一個JavaScript庫,可以跨瀏覽器在您的web應用程序中使用它:)它很穩定,我用它成功多個項目。 – dwarfy 2011-04-25 11:03:57

+1

我想我們可以提到[node.js](http://nodejs.org/),看起來很有前途......我沒有使用它,因爲我認爲它不夠成熟,無法在大型生產應用程序中使用它。 。 – dwarfy 2011-04-25 11:07:20

+0

最後,如果我們沒有提到由Facebook開發的非阻塞服務器來處理它們的實時特性,[TornadoWeb](http://www.tornadoweb.org/)就不會完整。 [github]上的聊天應用程序演示(https://github.com/facebook/tornado/tree/master/demos/chat)無論如何,您使用的是哪種服務器技術?這可以幫助您指導您的選擇...... – dwarfy 2011-04-25 11:13:08

0

當然 - 你可以使用jQuery(或任何其他訪問AJAX請求的方法)來輪詢服務器。在JavaScript中,設置一個時間間隔來執行輪詢(setInterval(myAjaxFunction)),然後使用類似jQuery.get()(http://api.jquery.com/jQuery.get/)的方法向服務器請求信息。

+0

輪詢確實有效,但會導致大量額外的網絡流量,並且在更新之前不可避免地會出現延遲。 – 2011-04-25 10:44:56

+1

我同意fahadsadah,投票沒有規模,並且在反應性和您可以處理的用戶數量之間進行權衡。此外,你最終會有很多流量(如果每秒有1000名用戶對您的網站進行輪詢,並且在1分鐘內沒有發生新的事件,則無需任何操作即可獲得60000個到您網站的連接) – dwarfy 2011-04-25 11:02:28

0

有兩種方法基於服務器的數據更新客戶端 - 一個是使客戶端輪詢服務器的時間間隔(jQuery將讓你喜歡的東西

setInterval(function() { $.post('my_url_here', myCallbackFunction) }, 1000); 

這可以說是最容易做到這一點解決方案,但它在流量方面對服務器不是很友好,並且它有一些其他的缺點,這可能對這個問題並不重要。

如果你看看websockets,node.js等,你可以實現同樣的事情很容易,但它是一個更大的學習曲線,而且你還需要一個服務器來運行軟件節點是允許客戶端和服務器之間透明通信的一個很好的解決方案,並且它附帶了幾個樣本,如node demo chat room