2010-04-18 8 views
17

Ich versuche zu verstehen, wie die Chat-Funktion von Facebook Nachrichten empfängt, ohne den Server ständig zu pollen.Wie vermeidet Facebook Chat die kontinuierliche Abfrage des Servers?

Firebug zeigt mir eine einzige GET XmlHttpRequest ständig dort sitzen, auf eine Antwort vom Server warten. Nach 5 Minuten war das nie abgelaufen.

Wie verhindern sie Timeout?

Eine AJAX-Anfrage kann auf diese Weise unbegrenzt lange auf einer Antwort warten?

Kann ich dies mit JSONRequest tun? Ich sehe dies bei json.org:

JSONRequest ist entworfen, um Duplex-Verbindungen zu unterstützen. Dies ermöglicht Anwendungen, in denen der Server asynchron Sendungen initiieren kann. Dies geschieht mit zwei simultanen Anfragen: eine zu senden und die andere an erhalten. Mithilfe des Timeout-Parameters kann eine POST-Anforderung ausstehen gelassen werden, bis der Server feststellt, dass aktuelle Daten gesendet werden.

Oder gibt es eine andere Möglichkeit, einen AJAX-Anruf einfach dort sitzen zu lassen und auf JSONRequest zu warten?

Antwort

25

Facebook verwendet eine Technik, die jetzt Comet heißt, um Nachrichten vom Server an den Client zu senden, anstatt den Client den Server abfragen zu lassen.

Es gibt viele Möglichkeiten, dies zu implementieren, wobei XMLHttpRequest long polling nur eine Option ist. Das Prinzip hinter dieser Methode ist, dass der Client eine normale XMLHttpRequest sendet, aber der Server reagiert nicht, bis ein Ereignis eintritt (z. B. wenn ein anderer Benutzer eine Nachricht sendet), sodass der Client warten muss. Wenn der Client eine Antwort erhält (oder wenn die Anforderung abläuft), erstellt der Client einfach eine neue Anforderung, sodass immer eine offene Anforderung an den Server gesendet wird.

+0

Ich dachte nur, dass, wenn ich eine lange Polling-Verbindung erstellen, mein Mac/Computer nicht in den Ruhezustand geht. Wie erfolgt das im Google Mail-Chat und auf Facebook? Oder verhindern sie auch das Schlafen? (Verwirrt.) – loveNoHate

Verwandte Themen