2012-05-29 11 views
5

Ich entwickle eine Webanwendung, die mit einem Server verbunden ist, und ich brauche den Server, um einige Informationen an die Clients zu einer bestimmten Zeit zu übertragen.Server-Client-Kommunikation: Long Polling, Comet, & Server-sendete Ereignisse (SSE)

Daher begann ich über Server-sent Events (SSE) zu lesen, weil die Website auf HTML5 entwickelt wurde und SSE schien das, was ich suchte. Aber was für eine Überraschung, als ich las, was SSE wirklich tat, war das Senden der Anfrage FROM vom Client an den Server, anstatt umgekehrt (gestern habe ich verstanden, dass langes Polling eine Art Push-Emulation ist). Daher fange ich an, über Web-Sockets zu lesen (aber es sah aus, dass der Standard noch ein Entwurf ist) und schaute auch auf Comet. Aber ich denke, ich kann nicht alle Stücke in meinen Kopf passen.

Würde jemand diese Technologien (und vielleicht auch andere Push-Technologien) hervorheben, die zu meinem Problem passen und welche Situation für jeden besser geeignet ist?

Vielen Dank, ich denke, ich bin auf diesem Gebiet völlig verloren.

Antwort

6

Diese post ist eine bessere Erklärung und diskutiert den Unterschied/Vorteile/etc, über Long Polling, Comet, SSE und WebSockets.

In den meisten Fällen muss der Client die erste Anforderung an den Server stellen, um eine Verbindung herzustellen. Sobald eine Verbindung hergestellt ist, kann der Server Daten an den Client senden. Selbst mit WebSockets wird der Client die erste Anforderung an den Server stellen, um eine zuverlässige Verbindung zwischen den beiden herzustellen.

Server-Gesendete Ereignisse verwendet eine normale HTTP GET-Anforderung, um eine Verbindung mit dem Server herzustellen. Es ist auch eine schreibgeschützte Verbindung für den Client. Es hat den Vorteil einer einfachen Implementierung, da wir kein neues Protokoll definieren müssen. Das Problem ist, dass HTTP-Verbindungen, selbst als persistente Verbindungen, nach etwa 15 Sekunden von den meisten Webservern geschlossen werden. Selbst bei lang andauernden Anfragen hat der Webserver oft eine Zeitüberschreitung, nach der er die Verbindung beendet. Hier kommt die Idee des Long Polling ins Spiel. Es ist eine einfache Idee, dass wir eine normale Ajax-Anfrage an den Server richten und der Server diese so lange wie möglich offen lässt. Wenn die Anfrage aus irgendeinem Grund vom Server geschlossen wird, machen Sie diese Anfrage sofort erneut. Sie können mit einem Server wie Node.js und einer normalen Ajax-Anfrage vom Browser recht einfach einen Polling-Mechanismus (zB Comet) implementieren. Server-Sent Events versucht, die browserseitige Implementierung davon mit EventSource zu abstrahieren. Anstatt dass Sie den Browser-/Client-Seitencode für langes Polling/Kometen implementieren müssen, übernimmt der Browser dies für Sie. Es bietet eine schöne Abstraktion von etwas, das wie eine dauerhafte Verbindung aussieht. Ihr Webserver muss nur nach GET-Anfragen Ausschau halten, die den Inhaltstyp in der Kopfzeile als "text/event-stream" angeben und die HTTP-Verbindung so lange wie möglich offen lassen.

Ich würde vorschlagen, dass Sie nicht zu kompliziert, was Server-Sent Ereignisse sind. Wenn Sie eine normale HTTP-GET-Anfrage verstehen, haben Sie wahrscheinlich bereits eine 90% ige Vorstellung von der dahinter stehenden Idee.

Es gibt einen Unterschied zwischen SSE/Comet und traditionellen langen Abfragen, die hervorgehoben werden könnten. Aus meiner Erfahrung ist die Idee hinter langen Abfragen, dass Ihre Anfrage nicht zurückkehrt, bis Sie ein Update haben. An diesem Punkt wird die HTTP-Verbindung geschlossen und unmittelbar danach eine weitere Anfrage gestellt. Mit SSE können Sie zwar die HTTP-Verbindung direkt nach dem Senden der aktualisierten Nachricht schließen, die Daten werden jedoch vom Server zum Client übertragen, ohne dass die HTTP-Anforderung tatsächlich geschlossen/beendet wird. Dies vermeidet den Aufwand, eine GET-Anfrage tatsächlich zu machen. Dies kann mit einer regulären Ajax-Anfrage erreicht werden, aber wieder bietet SSE eine schöne/effiziente Implementierung mit EventSource.

Edit: klar Unterscheidung zwischen SSE und Long-Polling.