Клиент на Java за API на WebSockets

1. Въведение

HTTP (Hypertext Transfer Protocol) е протокол за заявка-отговор без гражданство. Неговият опростен дизайн го прави много мащабируем, но неподходящ и неефективен за силно интерактивни уеб приложения в реално време поради размера на режийните разходи, които трябва да бъдат предадени заедно с всяка заявка / отговор.

Тъй като HTTP е синхронен и приложенията в реално време трябва да бъдат асинхронни, всякакви решения като анкетиране или дълго анкетиране (Comet) са склонни да бъдат сложни и неефективни.

За да разрешим горепосочения проблем, ни трябва стандартен двупосочен и пълен дуплекс протокол, който може да се използва както от сървъри, така и от клиенти, и това доведе до въвеждането на JSR 356 API - в тази статия ние „ ще покажа примерно използване на него.

2. Настройка

Нека включим зависимостите Spring WebSocket в нашия проект:

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

Винаги можем да получим най-новите версии на зависимостите от Maven Central за spring-websocket и spring-messaging.

3. ПЪТ

Протоколът за текстово ориентирани съобщения (STOMP) е прост, оперативно съвместим теленен формат, който позволява на клиента и сървърите да комуникират с почти всички брокери на съобщения. Това е алтернатива на AMQP (Advanced Message Queuing Protocol) и JMS (Java Messaging Service).

STOMP дефинира протокол за комуникация между клиент / сървър, използвайки семантика за съобщения. Семантиката е на върха на WebSockets и дефинира кадри, които са съпоставени с фреймовете на WebSockets.

Използването на STOMP ни дава гъвкавост за разработване на клиенти и сървъри на различни програмни езици. В настоящия пример ще използваме STOMP за съобщения между клиент и сървър.

4. WebSocket сървър

Можете да прочетете повече за изграждането на WebSocket сървъри в тази статия.

5. Клиент на WebSocket

За да комуникира със сървъра WebSocket, клиентът трябва да инициира връзката WebSocket, като изпрати HTTP заявка до сървър с правилно зададен заглавие за надстройка :

GET ws://websocket.example.com/ HTTP/1.1 Origin: //example.com Connection: Upgrade Host: websocket.example.com Upgrade: websocket

Моля, обърнете внимание, че URL адресите на WebSocket използват схеми ws и wss , вторият означава защитени WebSockets.

Сървърът отговаря обратно, като изпраща заглавката за надстройка в отговора, ако е активирана поддръжката на WebSockets.

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

След като този процес (известен също като WebSocket ръкостискане) приключи, първоначалната HTTP връзка се заменя с WebSocket връзка върху същата TCP / IP връзка, след което всяка от страните може да споделя данни.

Тази връзка от страна на клиента се инициира от екземпляр WebSocketStompClient .

5.1. В WebSocketStompClient

Както е описано в раздел 3, първо трябва да установим връзка WebSocket и това се прави с помощта на класа WebSocketClient .

В WebSocketClient може да бъде конфигуриран с помощта на:

  • StandardWebSocketClient, предоставен от всяко изпълнение на JSR-356 като Tyrus
  • JettyWebSocketClient, предоставен от Jetty 9+ родния API на WebSocket
  • Всяко внедряване на WebSocketClient на Spring

Ще използваме StandardWebSocketClient , изпълнение на WebSocketClient в нашия пример:

WebSocketClient client = new StandardWebSocketClient(); WebSocketStompClient stompClient = new WebSocketStompClient(client); stompClient.setMessageConverter(new MappingJackson2MessageConverter()); StompSessionHandler sessionHandler = new MyStompSessionHandler(); stompClient.connect(URL, sessionHandler); new Scanner(System.in).nextLine(); // Don't close immediately. 

По подразбиране WebSocketStompClient поддържа SimpleMessageConverter . Тъй като имаме работа с JSON съобщения, ние задаваме преобразувателя на съобщения на MappingJackson2MessageConverter, така че да преобразуваме полезния товар на JSON в обект.

Докато се свързваме с крайна точка, ние предаваме екземпляр на StompSessionHandler , който обработва събитията като afterConnected и handleFrame .

Ако нашият сървър има поддръжка на SockJs, тогава можем да модифицираме клиента да използва SockJsClient вместо StandardWebSocketClient.

5.2. В StompSessionHandler

Можем да използваме StompSession, за да се абонираме за тема WebSocket. Това може да се направи чрез създаване на екземпляр на StompSessionHandlerAdapter, който от своя страна реализира StompSessionHandler .

А StompSessionHandler осигурява жизнения цикъл събития за Stomp сесия. Събитията включват обратно извикване, когато сесията е установена и известия в случай на неуспехи.

Веднага след като клиентът WebSocket се свърже с крайната точка, се уведомява StompSessionHandler и се извиква методът afterConnected () , където използваме StompSession, за да се абонираме за темата:

@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("Received : " + msg.getText()+ " from : " + msg.getFrom()); }

Уверете се, че сървърът WebSocket работи и изпълнява клиента, съобщението ще се покаже на конзолата:

INFO o.b.w.client.MyStompSessionHandler - New session established : 53b993eb-7ad6-4470-dd80-c4cfdab7f2ba INFO o.b.w.client.MyStompSessionHandler - Subscribed to /topic/messages INFO o.b.w.client.MyStompSessionHandler - Message sent to websocket server INFO o.b.w.client.MyStompSessionHandler - Received : Howdy!! from : Nicky 

6. Заключение

В този бърз урок внедрихме Spring-based WebSocket клиент.

Пълното изпълнение може да бъде намерено в GitHub.