Contact

jWebSocket Headquarter

Innotrade GmbH

An Vieslapp 29

52134 Herzogenrath

Germany

Publications – Overview

Entwickler.de

03/2010

Alexander Schulze

jWebSocket ist ein High-Speed-Java-Kommunikationsserver für HTML5-Webs mit einem JavaScript-Client ohne spezielle Third-Party-Plug-ins. Ein Java-Client für Desktopapplikationen z. B. in Swing erscheint im März. Der Server, ein simples .jar-File, kann standalone oder als Dienst betrieben sowie in Webapplikationen unter Tomcat, JBoss, GlassFish oder Jetty integriert werden. Für die Clientseite ist lediglich eine einzelne .js-Datei erforderlich.

Enthalten sind die WS-Protokollimplementierung, Sessionmanagement und Authentifizierung sowie Connectoren für JSON, CSV und XML. Zusätzlich ein Streaming API, Remote Procedure Calls (RPC) und ein Plug-in-Modell für eigene Businesslogik. Für Enterprise-Anwendungen können mehrere Server zu einem Cluster verbunden werden.

Vorteile von WebSockets

Die Verwendung von TCP löst nicht nur den aus XHR und Comet bekannten Request/Response-Zwang ab, sondern es entfällt auch der HTTP-Overhead. Das bewirkt kürzere Latenz und mehr verfügbare Bandbreite. Während beim HTTP-Streaming zwei Kanäle belegt werden, bieten WebSockets echtes Full-Duplex auf einem einzigen TCP Socket. Ein WS-Server kann daher doppelt so viele gleichzeitige Verbindungen verwalten.

Auf dem Client bietet HTML 5 standardisierte Events, um eingehende Datenpakete oder den Auf- und Abbau einer Verbindung zu verarbeiten. Umständliche und browserspezifische Polling- oder Buffering-Mechanismen entfallen. Eine Übersicht, welche Browser WebSockets unterstützen, und eine WS-basierte Chatapplikation finden Sie auf jWebSocket.org.

Handshake

Wie bei XHR muss auch der WebSocket-Client die Verbindung zum Server aufbauen. Jedoch wird diese nach Austausch eines Handshakes im Gegensatz zu HTTP per Spezifikation aufrechterhalten. Für einen WebSocket-Server initiiert der Client statt mit http über das neue Schema ws://domain.tld:port/path?arguments die Verbindung. Der Client sendet einen Header in folgender Form:

GET <path> HTTP/1.1
Upgrade: WebSocket
Connection: Upgrade
Host: <hostname>:<port>
Origin: http://<host>[:<port>]

Den der Server wie folgt beantwortet:

HTTP/1.1 101 Web Socket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
WebSocket-Origin: http://<hostname>[:<port>]
WebSocket-Location: ws://<hostname>:<port>/

Anschließend können beide Parteien über einen einzigen Socket-Kanal bidirektional Daten austauschen. Der Handshake dient in erster Linie Sicherheitsaspekten, um z. B. Cross-Domain-Zugriffe zu kontrollieren.

Tokens

Grundsätzlich können Client und Server nun beliebige Datenpakete austauschen, jWebSocket stellt für eigene Protokolle entsprechende Low-Level-Klassen bereit. Um Pakete jedoch für beide Seiten leicht interpretierbar zu halten, implementiert die darüber liegende Protokollschicht so genannte Tokens. Auf dem Server sind dies Java-Objekte, nach außen wahlweise JSON-, CSV- oder XML-Pakete. Tokens können in beide Richtungen ausgetauscht, verarbeitet und beantwortet werden. Für Streaming-Anwendungen unterstützt jWebSocket so genannte One-Way-Token, bei denen der Absender keine Rückmeldung vom Empfänger erwartet.

Erster Start und Integration in eigene Applikationen

Nach dem Download stehen ein ausführbares .jar für einen Standalone-Server sowie eine im lokalen File-System lauffähige Demowebsite bereit – ein sofortiges Erfolgserlebnis ohne jeglichen Webserver oder weitere Installationen. Um den jWebSocket-Server als Service zu betreiben, bietet der Java Service Wrapper von Tanuki-Software eine Lösung für Produktivsysteme. Ebenso kann das .jar leicht in bestehende Webapplikationen integriert werden. Viele Source-Beispiele finden sich auf jWebSocket.org.

Erweitern mit Plug-ins

Der jWebSocket-Kern stellt lediglich eine Basisfunktionalität bereit. Um diese leicht erweitern zu können, erfolgt die Implementierung der Anwendungslogik mittels Plug-ins. Selbst die eigenen Funktionen sind über Plug-ins realisiert. Das API ist einfach gehalten und beschränkt sich auf drei Methoden, über die eingehende Tokens in der Kette der Plug-ins abgefangen, beantwortet oder delegiert werden können. So können leicht umfangreiche Anwendungen in Teams entwickelt und zu einer Gesamtlösung zusammengeführt werden.

Streaming

Während bei Finanzmarkt- oder News-Tickern die Aufgabe darin besteht, eigene oder angelieferte Datenströme vom Server zu verschiedenen Clients zu transportieren, kommt es bei Onlinezusammenarbeit oder Onlinegames darauf an, Ereignisse auf verschiedenen Clients schnell an andere Clients zu verteilen.

Der jWebSocket-Server verwaltet hierzu mehrere Streams, an denen sich die Clients registrieren. Die Streams können von eigenen oder externen DataPumps oder von den Clients selbst beliefert werden, was die Türen in alle Richtungen öffnet. Im jWebSocket-Paket ist ein Time Stream enthalten, der sekündlich die aktuelle Uhrzeit an die registrierten Clients versendet – dieses Beispiel kann auf jWebSocket.org online ausprobiert werden.

Verbindungskontrolle und Keep-Alive

Um Ports für neue Verbindungen freizugeben, werden inaktive Clients nach einer bestimmten Zeit getrennt. Für Anwendungen, bei denen Benutzer in erster Linie beobachten – z. B. News- oder Finanzmarkt-Ticker – bietet der jWebSocket-Client ein Keep-Alive (Ping) gegen den sonst üblichen Session-Timeout. Im Falle von Netzwerkstörungen kann der Client sogar automatisch die Verbindung wiederherstellen, ohne Datenverluste im abonnierten Stream.

URL-Parameter

Über den URL ist es dem Client möglich, während des Verbindungsaufbaus Argumente an den Server zu übermitteln. Zwar ist deren Format im WS-Protokoll nicht festgelegt, jWebSocket hält sich hier aber an die bekannte Form: ws://host:port[/pfad1[/pfad2]][?arg1=value1[&arg2=value2]] .

Der jWebSocket-Client verwendet diese Methode zur Auswahl des Datenformats (JSON, CSV oder XML) und eines individuellen Session-Timeouts innerhalb festgelegter Grenzen. Für besondere Anforderungen kann der Verbindungs-String auch individuell interpretiert werden.

Remote Procedure Calls

Aufgrund ihres schnellen Antwortverhaltens bieten WebSockets die favorisierte Grundlage für so genannte Remote Procedure Calls (RPC). Das im jWebSocket-Umfang enthaltene RPC Plug-in bietet die Möglichkeit, Methoden freigegebener Java-Klassen auf dem Server vom Client aus aufzurufen und das Ergebnis zurückzuliefern. Auf jWebSocket.org finden Sie ein Beispiel, wie eine MD5-Prüfsumme aus einem String auf dem Server berechnet und via RPC zurückgesendet wird.

Alexander Schulze: Gründer des jWebSocket-Projekts, IT-Consultant und Ausbilder für Fachinformatiker. Er ist Sprecher auf verschiedenen Konferenzen und Autor mehrerer Fachartikel und -bücher und betreut Unternehmen bei Datenbank-, Kommunikations- und Webtechnologien.

Copyright © 2013 Innotrade GmbH. All rights reserved.