En Java-klient til et WebSockets API

1. Introduktion

HTTP (Hypertext Transfer Protocol) er en statsløs anmodning-svar-protokol. Dens enkle design gør det meget skalerbart, men uegnet og ineffektivt til meget interaktive realtids webapplikationer på grund af den mængde overhead, der skal transmitteres sammen med hver anmodning / svar.

Da HTTP er synkron, og applikationer i realtid skal være asynkrone, har enhver løsning som afstemning eller lang afstemning (Comet) tendens til at være kompliceret og ineffektiv.

For at løse ovennævnte problem har vi brug for en standardbaseret, tovejs og full-duplex-protokol, som kunne bruges af både servere og klienter, og dette førte til introduktionen af ​​JSR 356 API - i denne artikel, vi ' Jeg viser et eksempel på, hvordan det bruges.

2. Opsætning

Lad os inkludere Spring WebSocket-afhængigheder i vores projekt:

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

Vi kan altid hente de nyeste versioner af afhængighederne fra Maven Central til spring-websocket og spring-messaging.

3. STOMP

Stream Text-Oriented Messaging Protocol (STOMP) er et simpelt, interoperabelt trådformat, der gør det muligt for klient og servere at kommunikere med næsten alle meddelelsesmæglere. Det er et alternativ til AMQP (Advanced Message Queuing Protocol) og JMS (Java Messaging Service).

STOMP definerer en protokol, som klienten / serveren kan kommunikere ved hjælp af semantik til messaging. Semantikken er oven på WebSockets og definerer rammer, der er kortlagt på WebSockets-rammer.

Brug af STOMP giver os fleksibiliteten til at udvikle klienter og servere på forskellige programmeringssprog. I dette aktuelle eksempel bruger vi STOMP til messaging mellem klient og server.

4. WebSocket Server

Du kan læse mere om opbygning af WebSocket-servere i denne artikel.

5. WebSocket-klient

For at kommunikere med WebSocket-serveren skal klienten starte WebSocket-forbindelsen ved at sende en HTTP-anmodning til en server med en Opgrader header indstillet korrekt:

FÅ ws: //websocket.example.com/ HTTP / 1.1 Oprindelse: //example.com Forbindelse: Upgrade Host: websocket.example.com Upgrade: websocket

Bemærk, at WebSocket URL-adresserne bruges ws og wss ordninger, betyder det andet sikre WebSockets.

Serveren svarer tilbage ved at sende Opgrader header i svaret, hvis understøttelse af WebSockets er aktiveret.

HTTP / 1.1 101 WebSocket Protocol Handshake Date: Wed, 16. Oct 2013 10:07:34 GMT Forbindelse: Upgrade Upgrade: WebSocket

Når denne proces (også kendt som WebSocket-håndtryk) er afsluttet, erstattes den oprindelige HTTP-forbindelse med WebSocket-forbindelse oven på den samme TCP / IP-forbindelse, hvorefter begge parter kan dele data.

Denne forbindelse på klientsiden initieres af WebSocketStompClient eksempel.

5.1. Det WebSocketStompClient

Som beskrevet i afsnit 3 skal vi først oprette en WebSocket-forbindelse, og dette gøres ved hjælp af WebSocketClient klasse.

Det WebSocketClient kan konfigureres ved hjælp af:

  • StandardWebSocketClient leveret af enhver JSR-356-implementering som Tyrus
  • JettyWebSocketClient leveret af Jetty 9+ native WebSocket API
  • Enhver implementering af Spring's WebSocketClient

Vi bruger StandardWebSocketClient, en implementering af WebSocketClient i vores eksempel:

WebSocketClient-klient = ny StandardWebSocketClient (); WebSocketStompClient stompClient = ny WebSocketStompClient (klient); stompClient.setMessageConverter (ny MappingJackson2MessageConverter ()); StompSessionHandler sessionHandler = ny MyStompSessionHandler (); stompClient.connect (URL, sessionHandler); ny scanner (System.in) .nextLine (); // Luk ikke med det samme. 

Som standard, WebSocketStompClient bakker op SimpleMessageConverter. Da vi har at gøre med JSON-meddelelser, indstiller vi meddelelsesomformeren til MappingJackson2MessageConverter for at konvertere JSON-nyttelasten til objekt.

Mens vi forbinder til et slutpunkt, passerer vi en forekomst af StompSessionHandler, som håndterer begivenhederne som efterConnected og handleFrame.

Hvis vores server har SockJs-support, kan vi ændre klienten, der skal bruges SockJsClient i stedet for StandardWebSocketClient.

5.2. Det StompSessionHandler

Vi kan bruge en StompSession for at abonnere på et WebSocket-emne. Dette kan gøres ved at oprette en forekomst af StompSessionHandlerAdapter som igen implementerer StompSessionHandler.

EN StompSessionHandler leverer livscyklusbegivenheder til en STOMP-session. Begivenhederne inkluderer tilbagekald, når sessionen er oprettet, og meddelelser i tilfælde af fejl.

Så snart WebSocket-klienten opretter forbindelse til slutpunktet, bliver StompSessionHandler meddeles, og afterConnected () metode kaldes hvor vi bruger StompSession for at abonnere på emnet:

@ Overstyr offentlig tomrum efterConnected (StompSession-session, StompHeaders connectedHeaders) {session.subscribe ("/ emne / meddelelser", dette); session.send ("/ app / chat", getSampleMessage ()); } @ Override public void handleFrame (StompHeaders headers, Object payload) {Message msg = (Message) nyttelast; logger.info ("Modtaget:" + msg.getText () + "fra:" + msg.getFrom ()); }

Sørg for, at WebSocket-serveren kører og kører klienten, meddelelsen vises på konsollen:

INFO obwclient.MyStompSessionHandler - Ny session oprettet: 53b993eb-7ad6-4470-dd80-c4cfdab7f2ba INFO obwclient.MyStompSessionHandler - Tilmeldt til / topic / meddelelser INFO obwclient.MyStompSessionHandler - Meddelelse sendt til websocket-server. Skønt !! fra: Nicky 

6. Konklusion

I denne hurtige vejledning har vi implementeret en Spring-baseret WebSocket-klient.

Den komplette implementering kunne findes på GitHub.