Java klijent za API WebSockets

1. Uvod

HTTP (Hypertext Transfer Protocol) je protokol zahtjeva i odgovora bez državljanstva. Njegov jednostavan dizajn čini ga vrlo skalabilnim, ali neprikladnim i neučinkovitim za visoko interaktivne web-aplikacije u stvarnom vremenu zbog količine općih troškova koje treba poslati uz svaki zahtjev / odgovor.

Budući da je HTTP sinkron, a aplikacije u stvarnom vremenu moraju biti asinkrone, sva rješenja poput anketiranja ili dugog anketiranja (Comet) obično su složena i neučinkovita.

Da bismo riješili gore navedeni problem, potreban nam je dvosmjerni protokol zasnovan na standardima i full-duplex protokol koji bi mogli koristiti i poslužitelji i klijenti, a to je dovelo do uvođenja JSR 356 API - u ovom smo članku Pokazat ću primjer njegove upotrebe.

2. Postavljanje

Uključimo ovisnosti Spring WebSocket u naš projekt:

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

Uvijek možemo dobiti najnovije verzije ovisnosti od Maven Central-a za spring-websocket i spring-messaging.

3. TOMP

Protokol tekstualno orijentiranih poruka (STOMP) jednostavni je, interoperabilni žičani format koji omogućuje klijentu i poslužiteljima komunikaciju s gotovo svim posrednicima poruka. Alternativa je AMQP-u (Advanced Message Queuing Protocol) i JMS-u (Java Messaging Service).

STOMP definira protokol za komunikaciju klijenta / poslužitelja pomoću semantike razmjene poruka. Semantika se nalazi na vrhu WebSockets i definira okvire koji se preslikavaju na okvire WebSockets.

Korištenje STOMP-a daje nam fleksibilnost za razvoj klijenata i poslužitelja na različitim programskim jezicima. U ovom trenutnom primjeru koristit ćemo STOMP za razmjenu poruka između klijenta i poslužitelja.

4. WebSocket poslužitelj

U ovom članku možete pročitati više o izradi WebSocket poslužitelja.

5. WebSocket klijent

Da bi komunicirao s WebSocket poslužiteljem, klijent mora započeti WebSocket vezu slanjem HTTP zahtjeva poslužitelju s Nadogradite zaglavlje pravilno postavljeno:

GET ws: //websocket.example.com/ HTTP / 1.1 Porijeklo: //example.com Veza: Nadogradnja Host: websocket.example.com Nadogradnja: websocket

Napominjemo da se koriste URL-ovi WebSocket ws i wss sheme, druga označava sigurne WebSockets.

Poslužitelj odgovara natrag slanjem Nadogradite zaglavlje u odgovoru ako je omogućena podrška za WebSockets.

HTTP / 1.1 101 WebSocket protokol rukovanja protokolom: srijeda, 16. listopada 2013. 10:07:34 GMT Veza: nadogradnja nadogradnja: WebSocket

Jednom kada je ovaj postupak (poznat i kao rukovanje WebSocket) završen, početna HTTP veza zamjenjuje se WebSocket vezom povrh iste TCP / IP veze nakon čega bilo koja strana može dijeliti podatke.

Ovu vezu na strani klijenta pokreće WebSocketStompClient primjer.

5.1. The WebSocketStompClient

Kao što je opisano u odjeljku 3, prvo moramo uspostaviti vezu WebSocket, a to se radi pomoću WebSocketClient razred.

The WebSocketClient može se konfigurirati pomoću:

  • StandardWebSocketClient osigurava bilo koja implementacija JSR-356 poput Tyrusa
  • JettyWebSocketClient pruža Jetty 9+ izvorni API WebSocket
  • Bilo kakva provedba Spring-a WebSocketClient

Koristit ćemo StandardWebSocketClient, provedba WebSocketClient u našem primjeru:

WebSocketClient klijent = novi StandardWebSocketClient (); WebSocketStompClient stompClient = novi WebSocketStompClient (klijent); stompClient.setMessageConverter (novo MappingJackson2MessageConverter ()); StompSessionHandler sessionHandler = novi MyStompSessionHandler (); stompClient.connect (URL, sessionHandler); novi skener (System.in) .nextLine (); // Ne zatvarajte odmah. 

Prema zadanim postavkama, WebSocketStompClient podupire SimpleMessageConverter. Budući da imamo posla s JSON porukama, postavili smo pretvarač poruka na MappingJackson2MessageConverter tako da pretvori JSON korisni teret u objekt.

Dok se povezujemo s krajnjom točkom, prolazimo instancu StompSessionHandler, koji obrađuje događaje poput nakonPovezani i handleFrame.

Ako naš poslužitelj ima podršku za SockJs, tada možemo izmijeniti klijenta da ga koristi SockJsClient umjesto StandardWebSocketClient.

5.2. The StompSessionHandler

Možemo koristiti a StompSession kako biste se pretplatili na temu WebSocket. To se može učiniti stvaranjem instance StompSessionHandlerAdapter koja pak provodi StompSessionHandler.

A StompSessionHandler pruža događaje životnog ciklusa za STOMP sesiju. Događaji uključuju povratni poziv kada je sesija uspostavljena i obavijesti u slučaju neuspjeha.

Čim se klijent WebSocket poveže s krajnjom točkom, StompSessionHandler je obaviješten i afterConnected () metoda se naziva tamo gdje koristimo StompSession pretplatiti se na temu:

@Override public void afterConnected (StompSession session, StompHeaders connectedHeaders) {session.subscribe ("/ topic / messages", this); session.send ("/ app / chat", getSampleMessage ()); } @Override public void handleFrame (StompHeaders headers, Object payload) {Message msg = (Message) payload; logger.info ("Primljeno:" + msg.getText () + "od:" + msg.getFrom ()); }

Provjerite radi li poslužitelj WebSocket i pokreće klijenta, poruka će se prikazati na konzoli:

INFO obwclient.MyStompSessionHandler - Uspostavljena nova sesija: 53b993eb-7ad6-4470-dd80-c4cfdab7f2ba INFO obwclient.MyStompSessionHandler - Pretplaćen na / topic / messages INFO obwclient.MyStompsocketHondlerMoSmobSoftHondler Zdravo !! od: Nicky 

6. Zaključak

U ovom smo brzom vodiču implementirali klijent WebSocket utemeljen na proljeću.

Kompletna implementacija može se naći na GitHubu.