Java kliens a WebSockets API-hoz

1. Bemutatkozás

A HTTP (Hypertext Transfer Protocol) egy hontalan kérelem-válasz protokoll. Egyszerű kialakítása nagyon skálázhatóvá teszi, de alkalmatlan és nem hatékony a nagyon interaktív, valós idejű webalkalmazásokhoz, mivel minden kérés / válasz mellett továbbítani kell a rezsit.

Mivel a HTTP szinkron, és a valós idejű alkalmazásoknak aszinkronoknak kell lenniük, minden olyan megoldás, mint például a polling vagy a long polling (Comet), általában bonyolult és nem hatékony.

A fenti probléma megoldásához szükségünk van egy szabványokon alapuló, kétirányú és full-duplex protokollra, amelyet a szerverek és az ügyfelek egyaránt használhatnak, és ez a JSR 356 API bevezetéséhez vezetett - ebben a cikkben Mutatok egy felhasználási példát.

2. Beállítás

Vegyük fel projektünkbe a tavaszi WebSocket-függőségeket:

 org.springframework spring-websocket 5.2.2.RELEASE org.springframework tavaszi üzenetküldés 5.2.2.RELEASE 

Mindig megkapjuk a Maven Centraltól a rugó-websocket és a tavaszi üzenetküldés függőségeinek legújabb verzióit.

3. STOMP

A Stream Text-Oriented Messaging Protocol (STOMP) egy egyszerű, interoperábilis vezetékes formátum, amely lehetővé teszi az ügyfél és a szerverek számára, hogy szinte az összes üzenetközvetítővel kommunikáljanak. Az AMQP (Advanced Message Queuing Protocol) és a JMS (Java Messaging Service) alternatívája.

A STOMP meghatározza a kliens / szerver kommunikációs protokollját az üzenetküldési szemantika segítségével. A szemantika a WebSockets tetején található, és meghatározza azokat a kereteket, amelyek a WebSockets keretekhez vannak leképezve.

A STOMP használata rugalmasságot kínál a kliensek és szerverek fejlesztésére különböző programozási nyelveken. Ebben a jelenlegi példában a STOMP-t fogjuk használni az ügyfél és a szerver közötti üzenetküldéshez.

4. WebSocket szerver

A WebSocket szerverek felépítéséről ebben a cikkben olvashat bővebben.

5. WebSocket kliens

A WebSocket kiszolgálóval való kommunikációhoz az ügyfélnek meg kell indítania a WebSocket kapcsolatot egy HTTP kérés elküldésével egy Frissítés a fejléc megfelelően van beállítva:

GET ws: //websocket.example.com/ HTTP / 1.1 Origin: //example.com Kapcsolat: Gazdagép frissítése: websocket.example.com Frissítés: websocket

Felhívjuk figyelmét, hogy a WebSocket URL-ek használják ws és wss sémák, a második a biztonságos WebSocketeket jelenti.

A szerver visszajelez a Frissítés fejléc a válaszban, ha a WebSockets támogatás engedélyezve van.

HTTP / 1.1 101 WebSocket protokoll kézfogás dátuma: 2013. október 16., szerda, 10:07:34 GMT Kapcsolat: Frissítés Frissítés: WebSocket

Miután ez a folyamat (más néven WebSocket kézfogás) befejeződött, a kezdeti HTTP-kapcsolatot felváltja a WebSocket-kapcsolat ugyanazon TCP / IP-kapcsolat tetején, amely után bármelyik fél megoszthatja az adatokat.

Ezt az ügyféloldali kapcsolatot a WebSocketStompClient példa.

5.1. A WebSocketStompClient

A 3. szakaszban leírtaknak megfelelően először létre kell hoznunk egy WebSocket kapcsolatot, és ez a használatával történik WebSocketClient osztály.

A WebSocketClient a következő módon konfigurálható:

  • StandardWebSocketClient bármely olyan JSR-356 megvalósítás biztosítja, mint a Tyrus
  • JettyWebSocketClient a Jetty 9+ natív WebSocket API biztosítja
  • A Spring's bármilyen megvalósítása WebSocketClient

Használni fogjuk StandardWebSocketClient, a megvalósítása WebSocketClient példánkban:

WebSocketClient ügyfél = új StandardWebSocketClient (); WebSocketStompClient stompClient = új WebSocketStompClient (kliens); stompClient.setMessageConverter (új MappingJackson2MessageConverter ()); StompSessionHandler sessionHandler = új MyStompSessionHandler (); stompClient.connect (URL, sessionHandler); új szkenner (System.in) .nextLine (); // Ne csukd be azonnal. 

Alapértelmezés szerint, WebSocketStompClient támogatja SimpleMessageConverter. Mivel JSON-üzenetekkel foglalkozunk, az üzenet-átalakítót állítottuk MappingJackson2MessageConverter a JSON hasznos terhelésének objektummá alakítása érdekében.

Miközben kapcsolódunk egy végponthoz, átadunk egy példányt StompSessionHandler, amely úgy kezeli az eseményeket afterConnected és handleFrame.

Ha szerverünk rendelkezik SockJs támogatással, akkor módosíthatjuk az ügyfelet a használatához SockJsClient ahelyett StandardWebSocketClient.

5.2. A StompSessionHandler

Használhatjuk a StompSession feliratkozni egy WebSocket témára. Ezt megtehetjük a StompSessionHandlerAdapter amely viszont végrehajtja a StompSessionHandler.

A StompSessionHandler életciklus eseményeket biztosít egy STOMP munkamenethez. Az események tartalmazzák a visszahívást, amikor a munkamenet létrejött, és értesítéseket hiba esetén.

Amint a WebSocket kliens csatlakozik a végponthoz, a StompSessionHandler értesítik, és a afterConnected () metódust hívjuk, ahol a StompSession feliratkozni a témára:

@Orride public void afterConnected (StompSession session, StompHeaders connectedHeaders) {session.subscribe ("/ topic / messages", this); session.send ("/ app / chat", getSampleMessage ()); } @Orride public void handleFrame (StompHeaders fejlécek, Object hasznos teher) {Message msg = (Message) hasznos terhelés; logger.info ("Fogadott:" + msg.getText () + "from:" + msg.getFrom ()); }

Győződjön meg arról, hogy a WebSocket kiszolgáló fut és futtatja az ügyfelet, az üzenet megjelenik a konzolon:

INFO obwclient.MyStompSessionHandler - Új munkamenet létrehozva: 53b993eb-7ad6-4470-dd80-c4cfdab7f2ba INFO obwclient.MyStompSessionHandler - Feliratkozott / téma / üzenetek INFO obwclient.MyStompSessionHwlier - kiszolgáló.kiszolgáló.kiszolgáló.kiszolgáló.kiszolgáló.kiszolgáló.kiszolgáló.kiszolgáló.kiszolgáló.kiszolgáló.kiszolgáló.kiszolgáló.kiszolgáló.kiszolgáló.kiszolgáló.kiszolgáló.kiszolgáló.kiszolgáló.kiszolgáló.kiszolgáló.kiszolgáló.kiszolgáló.kiszolgáló.szerver. Howdy !! től: Nicky 

6. Következtetés

Ebben a gyors bemutatóban egy tavaszi alapú WebSocket klienst valósítottunk meg.

A teljes megvalósítás megtalálható a GitHub-on.