En Java-klient for et WebSockets API

1. Introduksjon

HTTP (Hypertext Transfer Protocol) er en statsløs forespørselsresponsprotokoll. Den enkle designen gjør den veldig skalerbar, men uegnet og ineffektiv for svært interaktive sanntidsapplikasjoner på grunn av mengden overhead som må overføres sammen med hver forespørsel / respons.

Siden HTTP er synkron og applikasjoner i sanntid må være asynkrone, har alle løsninger som avstemning eller lang avstemning (Comet) en tendens til å være kompliserte og ineffektive.

For å løse det ovennevnte problemet trenger vi en standardbasert, toveis og full-dupleks protokoll som kan brukes av både servere og klienter, og dette førte til introduksjonen av JSR 356 API - i denne artikkelen, vi ' Jeg viser et eksempel på bruk av den.

2. Oppsett

La oss inkludere våren WebSocket avhengighet til prosjektet vårt:

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

Vi kan alltid få de nyeste versjonene av avhengighetene fra Maven Central for fjærnett og fjærmelding.

3. STOMP

Stream Text-Oriented Messaging Protocol (STOMP) er et enkelt, interoperabelt trådformat som gjør det mulig for klient og servere å kommunisere med nesten alle meldingsmeglerne. Det er et alternativ til AMQP (Advanced Message Queuing Protocol) og JMS (Java Messaging Service).

STOMP definerer en protokoll for klient / server for å kommunisere ved hjelp av meldingssemantikk. Semantikken er på toppen av WebSockets og definerer rammer som er kartlagt på WebSockets-rammer.

Bruk av STOMP gir oss fleksibilitet til å utvikle klienter og servere på forskjellige programmeringsspråk. I dette gjeldende eksemplet vil vi bruke STOMP for meldinger mellom klient og server.

4. WebSocket Server

Du kan lese mer om å bygge WebSocket-servere i denne artikkelen.

5. WebSocket-klient

For å kommunisere med WebSocket-serveren, må klienten starte WebSocket-tilkoblingen ved å sende en HTTP-forespørsel til en server med en Oppgradering topptekst satt riktig:

FÅ ws: //websocket.example.com/ HTTP / 1.1 Opprinnelse: //example.com Tilkobling: Upgrade Host: websocket.example.com Upgrade: websocket

Vær oppmerksom på at WebSocket URL-ene bruker ws og wss ordninger, betyr den andre sikre WebSockets.

Serveren svarer tilbake ved å sende Oppgradering topptekst i svaret hvis WebSockets-støtte er aktivert.

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

Når denne prosessen (også kjent som WebSocket-håndtrykk) er fullført, erstattes den første HTTP-tilkoblingen av WebSocket-tilkobling på toppen av samme TCP / IP-tilkobling, hvoretter begge parter kan dele data.

Denne forbindelsen på klientsiden er initiert av WebSocketStompClient forekomst.

5.1. De WebSocketStompClient

Som beskrevet i avsnitt 3, må vi først opprette en WebSocket-tilkobling, og dette gjøres ved hjelp av WebSocketClient klasse.

De WebSocketClient kan konfigureres ved hjelp av:

  • StandardWebSocketClient levert av en hvilken som helst JSR-356-implementering som Tyrus
  • JettyWebSocketClient levert av Jetty 9+ native WebSocket API
  • Enhver implementering av Spring’s WebSocketClient

Vi vil bruke StandardWebSocketClient, en implementering av WebSocketClient i vårt eksempel:

WebSocketClient-klient = ny StandardWebSocketClient (); WebSocketStompClient stompClient = ny WebSocketStompClient (klient); stompClient.setMessageConverter (ny MappingJackson2MessageConverter ()); StompSessionHandler sessionHandler = ny MyStompSessionHandler (); stompClient.connect (URL, sessionHandler); ny skanner (System.in) .nextLine (); // Ikke lukk umiddelbart. 

Som standard, WebSocketStompClient støtter SimpleMessageConverter. Siden vi har å gjøre med JSON-meldinger, setter vi meldingsomformeren til MappingJackson2MessageConverter for å konvertere JSON-nyttelasten til objektet.

Mens vi kobler til et endepunkt, passerer vi en forekomst av StompSessionHandler, som håndterer hendelsene som etterKoblet og handleFrame.

Hvis serveren vår har SockJs-støtte, kan vi endre klienten som skal brukes SockJsClient i stedet for StandardWebSocketClient.

5.2. De StompSessionHandler

Vi kan bruke en StompSession for å abonnere på et WebSocket-emne. Dette kan gjøres ved å opprette en forekomst av StompSessionHandlerAdapter som igjen implementerer StompSessionHandler.

EN StompSessionHandler gir livssyklushendelser for en STOMP-økt. Hendelsene inkluderer tilbakeringing når økten er etablert og varsler i tilfelle feil.

Så snart WebSocket-klienten kobles til sluttpunktet, blir StompSessionHandler blir varslet og afterConnected () metoden kalles der vi bruker StompSession for å abonnere på emnet:

@ Overstyr offentlig tomrom etterConnected (StompSession-økt, StompHeaders connectedHeaders) {session.subscribe ("/ topic / meldinger", dette); session.send ("/ app / chat", getSampleMessage ()); } @Override public void handleFrame (StompHeaders headers, Object payload) {Message msg = (Message) nyttelast; logger.info ("Mottatt:" + msg.getText () + "fra:" + msg.getFrom ()); }

Forsikre deg om at WebSocket-serveren kjører og kjører klienten, meldingen vises på konsollen:

INFO obwclient.MyStompSessionHandler - Ny økt etablert: 53b993eb-7ad6-4470-dd80-c4cfdab7f2ba INFO obwclient.MyStompSessionHandler - Abonnert på / topic / meldinger INFO obwclient.MyStompSessionHandler - Melding sendt til nettverksserver INFO obomp Skikkelig !! fra: Nicky 

6. Konklusjon

I denne raske opplæringen har vi implementert en vårbasert WebSocket-klient.

Den komplette implementeringen kan bli funnet på GitHub.


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