HTML5 - zdarzenia wysłane przez serwer
Konwencjonalne aplikacje internetowe generują zdarzenia, które są wysyłane do serwera WWW. Na przykład proste kliknięcie łącza żąda nowej strony z serwera.
Zdarzenia przesyłane z przeglądarki do serwera WWW można nazwać zdarzeniami wysyłanymi przez klienta.
Wraz z HTML5, WHATWG Web Applications 1.0 wprowadza zdarzenia, które przepływają z serwera WWW do przeglądarek internetowych i nazywane są zdarzeniami wysłanymi przez serwer (SSE). Korzystając z SSE, możesz w sposób ciągły wypychać zdarzenia DOM z serwera WWW do przeglądarki odwiedzającego.
Podejście do przesyłania strumieniowego zdarzeń otwiera trwałe połączenie z serwerem, wysyłając dane do klienta, gdy dostępne są nowe informacje, eliminując potrzebę ciągłego odpytywania.
Zdarzenia wysyłane przez serwer standaryzują sposób, w jaki przesyłamy dane z serwera do klienta.
Aplikacja internetowa dla SSE
Aby użyć zdarzeń wysłanych przez serwer w aplikacji internetowej, trzeba dodać element <eventsource> do dokumentu.
Plik src atrybut elementu <eventsource> powinien wskazywać na adres URL, który powinien zapewniać trwałe połączenie HTTP, które wysyła strumień danych zawierający zdarzenia.
Adres URL wskazywałby na skrypt PHP, PERL lub dowolny skrypt w Pythonie, który zadbałby o spójne przesyłanie danych o zdarzeniach. Poniżej znajduje się prosty przykład aplikacji internetowej, która wymagałaby czasu serwera.
<!DOCTYPE HTML>
<html>
<head>
<script type = "text/javascript">
/* Define event handling logic here */
</script>
</head>
<body>
<div id = "sse">
<eventsource src = "/cgi-bin/ticker.cgi" />
</div>
<div id = "ticker">
<TIME>
</div>
</body>
</html>
Skrypt po stronie serwera dla SSE
Powinien wysłać skrypt po stronie serwera Content-typenagłówek określający typ tekstu / strumień zdarzenia w następujący sposób.
print "Content-Type: text/event-stream\n\n";
Po ustawieniu typu zawartości skrypt po stronie serwera wyśle plik Event: tag, po którym następuje nazwa zdarzenia. Poniższy przykład wyśle czas serwera jako nazwę zdarzenia zakończoną znakiem nowego wiersza.
print "Event: server-time\n";
Ostatnim krokiem jest przesłanie danych zdarzenia za pomocą Data: znacznik, po którym następowałaby liczba całkowita będąca wartością ciągu zakończona znakiem nowego wiersza w następujący sposób -
$time = localtime();
print "Data: $time\n";
Wreszcie, poniżej znajduje się kompletny ticker.cgi napisany w Perlu -
#!/usr/bin/perl
print "Content-Type: text/event-stream\n\n";
while(true) {
print "Event: server-time\n";
$time = localtime();
print "Data: $time\n";
sleep(5);
}
Obsługa zdarzeń wysłanych przez serwer
Zmodyfikujmy naszą aplikację internetową, aby obsługiwała zdarzenia wysyłane przez serwer. Oto ostatni przykład.
<!DOCTYPE HTML>
<html>
<head>
<script type = "text/javascript">
document.getElementsByTagName("eventsource")[0].addEventListener("server-time",
eventHandler, false);
function eventHandler(event) {
// Alert time sent by the server
document.querySelector('#ticker').innerHTML = event.data;
}
</script>
</head>
<body>
<div id = "sse">
<eventsource src = "/cgi-bin/ticker.cgi" />
</div>
<div id = "ticker" name = "ticker">
[TIME]
</div>
</body>
</html>
Przed przetestowaniem zdarzeń wysłanych z serwera sugerowałbym, aby upewnić się, że Twoja przeglądarka internetowa obsługuje tę koncepcję.