3. Warum … ?
➔
moderne Webanwendungen ähneln immer mehr
RichClient-Applikationen
für derartige Anwendungen ist das HTTP Protokoll
nicht gemacht
es braucht „Hacks“ bzw. Erweiterungen
7. Comet - Long-Polling
➔
Browser setzt eine AJAX Anfrage ab
bleibt geöffnet bis neue Daten vom Server gesendet
werden
Daten werden in der „onreadystatechange“ CallbackFunktion verarbeitet
neue Verbindung wird aufgebaut
7
8. Comet - Streaming
➔
eine persistente HTTP Verbindung
➔
Daten werden inkrementell verarbeitet
➔
ohne die Verbindung zu schließen
zwei Varianten:
„hidden iframe“
XMLHttpRequest
●
Daten werden in der „onreadystatechange“ CallbackFunktion verarbeitet
8
9. Comet - „Hacks“
➔
Nur 2 gleichzeitige persistente Verbindungen je Client
zu einem Server erlaubt (HTTP 1.1)
➔
Komplex
➔
seit 2008 haben die meisten Browser jedoch auf 6
Verbindungen erweitert
Bidirektionale Verbindung muss über zwei Kanäle simuliert
werden
HTTP–Overhead
Request-/ Response-Header
9
11. HTML5 Server-Sent Event (SSE)
➔
Unidirektionale Kommunikation Server->Client
➔
Client abonniert einen Stream
➔
➔
Bei neuen Ereignissen wird der Client
benachrichtigt
Verbindung bleibt geöffnet
geschlossene Verbindungen werden automatisch wieder
geöffnet
11
12. SSE – JavaScript API
if (!!window.EventSource) {
var source = new EventSource('sse-stream.html');
} else {
// Result to xhr polling :(
}
// new message callback function
source.addEventListener('message', function(e) {
console.log(e.data);
}, false);
// register open callback (optional)
source.addEventListener('open', function(e) { ... }, false);
// register error callback (optional)
source.addEventListener('error', function(e) { ... }, false);
// cancel
source.close();
12
13. SSE - Server-response
HTTP/1.1 200 OK
Content-Type: text/event-stream
Cache-Control: no-cache
Connection: keep-alive
id: my-unique-connection-id
event: foo
data: This is the 1st line
data: Here comes the 2nd line
13
21. WebSocket – JavaScript API
var websocket = new WebSocket('ws://ws.example.com/chat', ['foo', 'bar']);
websocket.onopen = function () {
websocket.send('Ping'); // Send the message 'Ping' to the server
};
// process new message from the server
websocket.onmessage = function (e) {
console.log('Server: ' + e.data);
};
// register error callback function
websocket.onerror = function (error) { ... }
21
22. WebSocket – Jetty WebSocketServlet
class ChatWebSocketServlet extends WebSocketServlet {
def doGet(request: HttpServletRequest, response: HttpServletResponse) {}
def doPost(request: HttpServletRequest, response: HttpServletResponse) {}
def doWebSocketConnect(request: HttpServletRequest, protocol: String) =
new ChatWebSocket()
// shared resource (thread-safe !!!)
private val members = new CopyOnWriteArraySet<ChatWebSocket>()
}
class ChatWebSocket extends WebSocket {
...
}
22
24. WebSocket – Probleme
➔
Wird (noch) nicht von allen Browsern unterstützt
➔
WebSocket-Handshake wird von einigen ProxyServern unterbunden
➔
daher Frameworks wie „Atmosphere“ verwenden, die
einen automatischen „Fallback“ auf Comet bieten.
„Connection: Upgrade“ wird nicht verstanden
Low-Level API
Verbindungsabbrüche müssen selbst erkannt und
repariert werden
keine garantierte Verarbeitung von Nachrichten
24
31. SPDY – spdy-jetty-http Modul
➔
SPDY wird von Jetty ab Version 7.6.2 und 8.1.2
unterstützt
➔
setzt OpenJDK 1.7+ voraus
➔
kann transparent aktiviert werden
keine Änderung der Applikation nötig
31
seit 2005 wird die Technologie unter diesem Namen verwendet
Konzept der asynchronen Datenübertragung ermöglicht es, HTTP-Anfragen durchzuführen, während eine HTML-Seite angezeigt wird.
Somit kann die Seite verändert werden, ohne sie komplett neu zu laden.
Restriktion: Nur Client kann aktiv Anfragen durchführen.
Begriff wurde erstmals 2006 von Alex Russell geprägt
erste Comet Applikationen wie Google Chat und später Google Docs.
Jetty 7.x und 8.x (via WebSocketServlet)
Tomcat 7.x (via WebSocketServlet)
jWebSocket Server (standalone)