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.