Klient Java pre rozhranie WebSockets API

1. Úvod

HTTP (Hypertext Transfer Protocol) je bezstavový protokol požiadavka-odpoveď. Vďaka jeho jednoduchému dizajnu je veľmi škálovateľný, ale nevhodný a neefektívny pre vysoko interaktívne webové aplikácie v reálnom čase, a to z dôvodu množstva réžie, ktorú je potrebné preniesť spolu s každou požiadavkou / odpoveďou.

Pretože protokol HTTP je synchrónny a aplikácie v reálnom čase musia byť asynchrónne, akékoľvek riešenia, ako je polling alebo long polling (Comet), bývajú komplikované a neefektívne.

Na vyriešenie vyššie uvedeného problému potrebujeme štandardný, obojsmerný a plne duplexný protokol, ktorý by mohli používať servery aj klienti, čo viedlo k zavedeniu rozhrania JSR 356 API - v tomto článku uvádzame: Ukážem jeho príkladné použitie.

2. Inštalácia

Zahrňme do nášho projektu jarné závislosti WebSocket:

 org.springframework spring-websocket 5.2.2.RELEASE org.springframework spring-messaging 5.2.2.RELEASE 

Vždy môžeme získať najnovšie verzie závislostí od Maven Central pre spring-websocket a spring-messaging.

3. STOMP

Stream Text-Oriented Messaging Protocol (STOMP) je jednoduchý interoperabilný formát drôtu, ktorý umožňuje klientovi a serverom komunikovať s takmer všetkými sprostredkovateľmi správ. Je alternatívou k AMQP (Advanced Message Queuing Protocol) a JMS (Java Messaging Service).

STOMP definuje protokol pre komunikáciu klienta / servera pomocou sémantiky správ. Sémantika je nad WebSocketmi a definuje rámce, ktoré sú mapované na rámce WebSockets.

Používanie programu STOMP nám poskytuje flexibilitu pri vývoji klientov a serverov v rôznych programovacích jazykoch. V tomto aktuálnom príklade použijeme STOMP na zasielanie správ medzi klientom a serverom.

4. Server WebSocket

Viac o vytváraní serverov WebSocket sa dočítate v tomto článku.

5. Klient WebSocket

Pre komunikáciu so serverom WebSocket musí klient inicializovať pripojenie WebSocket zaslaním požiadavky HTTP na server s Inovovať hlavička nastavená správne:

ZÍSKAJTE ws: //websocket.example.com/ HTTP / 1.1 Pôvod: //example.com Pripojenie: Hostiteľ inovácie: websocket.example.com Aktualizácia: websocket

Upozorňujeme, že adresy URL WebSocket sa používajú ws a wss schémy, druhá označuje zabezpečené WebSockety.

Server odpovie späť odoslaním Inovovať hlavička v odpovedi, ak je povolená podpora WebSockets.

HTTP / 1.1 101 WebSocket Protocol Handshake Dátum: St, 16. október 2013 10:07:34 GMT Pripojenie: Aktualizácia Aktualizácia: WebSocket

Po dokončení tohto procesu (známeho tiež ako podanie protokolu WebSocket) sa počiatočné pripojenie HTTP nahradí pripojením WebSocket nad rovnakým pripojením TCP / IP, po ktorom môžu obe strany zdieľať údaje.

Toto pripojenie na strane klienta iniciuje WebSocketStompClient inštancia.

5.1. The WebSocketStompClient

Ako je popísané v časti 3, najskôr je potrebné nadviazať pripojenie WebSocket a to sa deje pomocou WebSocketClient trieda.

The WebSocketClient možno konfigurovať pomocou:

  • StandardWebSocketClient poskytované akoukoľvek implementáciou JSR-356 ako Tyrus
  • JettyWebSocketClient poskytované natívnym WebSocket API Jetty 9+
  • Akákoľvek implementácia Spring’s WebSocketClient

Použijeme StandardWebSocketClient, implementácia WebSocketClient v našom príklade:

WebSocketClient klient = nový StandardWebSocketClient (); WebSocketStompClient stompClient = nový WebSocketStompClient (klient); stompClient.setMessageConverter (nový MappingJackson2MessageConverter ()); StompSessionHandler sessionHandler = nový MyStompSessionHandler (); stompClient.connect (URL, sessionHandler); nový skener (System.in) .nextLine (); // Nezatvárajte ihneď. 

Predvolene, WebSocketStompClient podporuje SimpleMessageConverter. Pretože máme do činenia so správami JSON, nastavili sme prevodník správ na MappingJackson2MessageConverter aby sa premenilo užitočné zaťaženie JSON na objekt.

Pri pripájaní ku koncovému bodu odovzdáme inštanciu StompSessionHandler, ktorý udalosti vybavuje ako afterConnected a handleFrame.

Ak má náš server podporu SockJs, môžeme klienta upraviť tak, aby sa používal SockJsClient namiesto StandardWebSocketClient.

5.2. The StompSessionHandler

Môžeme použiť a StompSession prihlásiť sa na odber témy WebSocket. To je možné dosiahnuť vytvorením inštancie StompSessionHandlerAdapter ktorá zase implementuje StompSessionHandler.

A StompSessionHandler poskytuje udalosti životného cyklu pre reláciu STOMP. Medzi udalosti patrí spätné volanie po vytvorení relácie a upozornenia v prípade zlyhania.

Hneď ako sa klient WebSocket pripojí k koncovému bodu, StompSessionHandler je informovaný a afterConnected () metóda sa volá tam, kde používame StompSession prihlásiť sa na odber témy:

@Override public void afterConnected (relácia StompSession, StompHeaders connectedHeaders) {session.subscribe ("/ topic / messages", toto); session.send ("/ app / chat", getSampleMessage ()); } @Override public void handleFrame (hlavičky StompHeaders, užitočné zaťaženie objektu) {Správa msg = (užitočné) zaťaženie správy; logger.info ("Prijaté:" + msg.getText () + "z:" + msg.getFrom ()); }

Uistite sa, že server WebSocket je spustený a beží klient, na konzole sa zobrazí správa:

INFO obwclient.MyStompSessionHandler - vytvorená nová relácia: 53b993eb-7ad6-4470-dd80-c4cfdab7f2ba INFO obwclient.MyStompSessionHandler - prihlásený na odber / topic / messages INFO obwclient.MyStompSessionHandler - správa odoslaná na server websocket INFO - - Ahoj !! od: Nicky 

6. Záver

V tomto rýchlom návode sme implementovali jarného klienta WebSocket.

Kompletnú implementáciu nájdete na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found