Die Spezifikation (rfc6455) zu Websockets hat schon einige Jahre auf den Buckel, ist damit aber in allen bekannten Browsern verfügbar. Die Javascript API ist übersichtlich und mit nur wenigen Schritten kann eine bidirektionale Verbindung zwischen Browser und Server hergestellt werden, um Benachrichtigungen vom Server zu erhalten ohne ein alt modisches Polling zu implementieren. Auf Java-Seite steht mit Java EE 7 ebenfalls ein Standard bereit (jsr356) der die Server-Seite für Websocket Szenarien bereit stellt. Werfen wir einen kurzen Blick auf das Zusammenspiele im Beispiel JavaScript + Java EE 7
Die Initialisierung einer Websocket Verbindung in JavaScript ist mit einigen wenigen Zeilen Code bereitgestellt und stellt Listener-Methoden bereit um auf Ereignisse zu reagieren
var wsConnection = new WebSocket('ws://example.ws.service/ws'); wsConnection.onopen = function () {...}; wsConnection.onerror = function (error) {...}; wsConnection.onmessage = function (e) {...};
Auch das Pendant auf der Serverseite ist nicht wesentlich umfangreicher, das Vorgehen ist simple: wir erstellen eine Klasse und registrieren sie als WebSocket Endpoint mittels der Annotation “ServerEndpoint”. Die entsprechenden Nachrichten um auf Events zu reagieren werden mit zusätzlichen Annotation versehen. In unserem Beispiel führen wir zusätzlich eine Liste aller verbundenen Clients um diese mit Push-Nachrichten zu versorgen.
EchoEndpoint.java
@ServerEndpoint("/echo") public class EchoEndPoint { private static Set<Session> userSessions = Collections.newSetFromMap(new ConcurrentHashMap<Session, Boolean>()); @OnOpen public void onOpen(Session userSession) { System.out.println("Neue Verbindung aufgebaut..."); userSessions.add(userSession); } @OnClose public void onClose(Session userSession) { System.out.println("Verbindung getrennt..."); userSessions.remove(userSession); } @OnMessage public void onMessage(String message, Session userSession) { broadcast(message); } public static void broadcast(String msg) { System.out.println("Broadcast Nachricht an alle:" + msg); for (Session session : userSessions) { session.getAsyncRemote().sendText("Re: " + msg); } } }
Das war es schon, mehr ist nicht nötig um JavaScript und Java EE 7 über einen WebSocket zusammen zu bringen.
Ein vollständiges Beispiel findet sich wie immer bei uns im Github:
websocket-demo @ GITHUB