Следующее руководство - это CRM -система компании, которую я участвовал в разработке компании, и разобралась с некоторой соответствующей информацией. В системе есть много функций push, и в ней используется технология WebSocket. Следующий редактор скомпилировал и поделился его на сетевой платформе Wulin для вашей ссылки
1. Зависимость Maven
<Depoydency> <groupid> javax.servlet </GroupId> <ArtifactId> javax.servlet-api </artifactid> <sersive> 3.1.0 </version> </dependency> <dehydency> <groupid> com.fasterxml.jackson.core </Groupid> <ratifactid> jackson-core </artifactid>. 0 </version> </deperency> <dependency> <groupid> com.fasterxml.jackson.core </groupid> <artifactid> jackson-core </artifactid> <sersion> 2.3.0 </version> </dependency> <depective> <groupid> com.fasterxml.jackson.core </GroupD> <Artifactid> -Датабинд </artifactid> <sersion> 2.3.0 </version> </vehyederian> <depervice> <groupid> org.springframework </groupid> <artifactid> spring-websocket </artifactid> <serse> 4.0.1. Release </version> </deperency> <dependency> <groupid> org.springframework </groupid> <artifactid> Spring-messaging </artifactid> <serse> 4.0.1.release </version> </getyederian>
2. Конфигурация пружинного сервиза
<? xml version = "1.0" Encoding = "UTF-8"?> <фасоль xmlns = "http://www.springframework.org/schema/beans" xmlns: context = "http://www.springframework.org/schema/cont Ext "xmlns: mvc =" http://www.springframework.org/schema/mvc "xmlns: tx =" http://www.springframework.org/schema/tx " xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns: websocket = "http://www.springframework.org/schema/websocket" xsi: schemalocation = "http: //www .springframework.org/schema/beanshttp: //www.springframework.org/schema/beans/spring-beans-3.1.xsdhttp: //www.springframework.org/schema/context/spring -context-3.1.xsdhttp: //www.springframework.org/schema/mvchttp: //www.springframework.o rg/schema/mvc/spring-mvc-3.1.xsdhttp: //www.springframework.org/schema/txhttp: //www.spr ingframework.org/schema/tx/spring-tx-3.1.xsdhttp://www.springframework.org/schema/websocketthttp://www.springframework.org/schema/websocket/spring-websocket.xsd .; id = "websocket"/> <websocket: Handlers> <websocket: mapping path = "/websocket" handler = "websocket"/> <websocket: handshake-interceptors> <bean/> <websocket: interceptors> </websocket: Handlers> </beans>
Среди них путь, соответствующий пути, - это путь интерфейса, который был настроен через протокол WS в предыдущем разделе.
3. Реализация рукоятки
пакет cn.bridgeli.websocket; import cn.bridgeli.utils.usermanager; import cn.bridgeli.util.dateutil; импорт cn.bridgeli.sharesession.userinfo; импорт org.apache.commons.lang.stringtils; importf4j.logger; org.slf4j.loggerfactory; import org.springframework.http.server.serverhttprequest; import org.springframework.http.server.serverhttpresponse; import.springframework.web.context.Request.RequestConter; org.springframework.web.context.request.servletrequestattributes; импорт org.springframework.web.socket.websockethandler; импорт org.springframework.web.socket.server.support.httpsessessionHandshakeR; @Description: создать интерфейс рукопожатия* @date: 16-3-3*/public Class Handshakeinterceptor Extends httpsessionHandshakeInterceptor {private Static Final Logger = loggerFactory.getLogger (HandshakeInterceptor.class); @overpublic booleanse Wshandler, Map <String, Object> Attributes) Throws Exception {logger.info («Перед созданием рукопожатия ...»); servletRequestattributes attrs = (servletrequestattributes) requestCOntexTholder.getRequestAttributes (); userInfo curruser = usermager.getsessionUser (attr.getsoctectestocteose (aterlessocteose (aterlessocteosoceeose Usersoctockevo (); string emike = ""; if (null! = Curruser) {email = curruser.getemail ();} if (stringutils.isblank (email)) {email = dateutil.date2string (new Date ());} usersoctoChocto.SetuserEmail (email); attributes.put ("session_user", usersockectovo); return super.beforehandshake (запрос, ответ, Wshandler, Attributes);}@overridePublic void waodshake (ServerHttpRequest запрос, серверПоскольку я не очень хорошо понимаю, я в максимальной степени держу исходный код. Это на самом деле следует извлечь текущего пользователя входа в систему с единого входа в систему, преобразовать его в объект usersockeCoteVO и поместить на карту. Итак, давайте посмотрим на определение объекта usersockeCoteVO
4. Определение пользователей userocketvo
пакет cn.bridgeli.websocket; import org.springframework.web.socket.websocketsession; импорт java.util.date;/*** @description: user socket connection*@date: 16-3-7*/public class userockockeocketo {private String useremail; // Пользователь по электронной почте частная дата подключение к подключению; // Успешное время подключения частная дата Prerequesttime; // Последнее время запроса частная дата NewRequesttime; // Новое время запроса частная дата LastSendTime = New Date (); // Последнее время отправки сообщения о удалении частной даты // последнее время отправки ожидаемого задания частная веб -сайта WebSocketSession; // WSSession, соответствующая только пользователю кэшам по умолчанию // getxx и setxx}Наиболее важным является свойство WebSocketSession, которое мы будем использовать позже
5. Реализация WebSocketEndPoint
пакет cn.bridgeli.websocket; import org.slf4j.logger; import org.slf4j.loggerfactory; import org.springframework.beans.factory.annotation.autowired; импорт org.springframework.web.socket.clesestatus; импорт org.sprimework.webess. org.springframework.web.socket.websocketsession; import org.springframework.web.socket.handler.textwebsockethandler;/*** @description: websocket обработка*@date: 16-3-3*/public websocketendpoint extends websockethandler {private Static Final Logger = Loggerfactory.getLogger (websocketocketendpoint.class);@AutoWireDPrivate NewsListenerImpl NewsListener; @OverrideProtected void handletextmessage (сеанс веб -сайта, сообщение TextMessage) Thfis Exception {super.handletextmessage (сессия, сообщение); textmessage returnMessage = new TextMessage () Server "); session.sendmessage (returnmessage);}/*** @description: после установления соединения* @param session* @throws exception*/ @overiDepublic void после comeconnectioneStablesed (websocketsession session) throws exception {userockockeockeockeockeockeococeto = (userockecotevo) session.getattributes () get (" sessionsockeockeocketo = (userockecocetvo) session.getattributes (). if (null! = usersoctockeo) {usersockecketvo.setwebsocketsession (session); if (wssessionlocalcache.exists (usersockecto.getuseremail ())) {wssessionlocalcache.remove (usersockectoce.getuseremail ());} wssessionlocalcache.put (usersockeopto.getuseremail (),} wssessionlocalcache. userSocketVo);newsListener.afterConnectionEstablished(userSocketVo.getUserEmail());}logger.info("socket successfully established connection...");super.afterConnectionEstablished(session);}@Overridepublic void afterConnectionClosed(WebSocketSession session,CloseStatus status) throws Exception{UserSocketVo userSocketVo = (UsersockeChockVo) session.getAttributes (). Get ("session_user"); if (null! = Usersoctocevo) {wssessionlocalcache.remove (usersockeckeockeo.getuseremail ());} logger.info ("Socket успешно закрыл соединение ..."); Super.afterConnectionClazeCloscloscloscloscloscloscloscloseclodection (Session);6. Реализация wssessionLocalcache
Пакет cn.bridgeli.websocket; import java.io.serializable; import java.util.arraylist; import java.util.hashmap; импорт java.util.list; импорт java.util.map;/*** @description: Encectionsessession*@date: 16-7-7 *** @description: {Приватная статическая карта <string, usersoctockeo> wssessionCache = new Hashmap <> (); Usersockectovo) {wssessionCache.put (usermail, usersockockeockeo);} public usersoctockeockeockeo get (string usermail) {return wssessionCache.get (usermail);} public static void remove (String usermail) {wssessionCache.Remove (userMail); ArrayList <> (wssessionCache.values ());}}Посмотрев на его реализацию, эффект более очевиден. В нем хранится последние данные каждого пользователя chonsocetVO. Фактически, наша реализация WebSocket была рассчитана здесь, но все еще есть основной класс (класс Чарли о бизнес -логике), который не был реализован. В следующей статье пример приложения для интегрированного WebSocket (часть 2) мы увидим, как реализовать этот класс.
Введение в протокол WebSocket
Протокол WebSocket является важной функцией в веб-поле, определенной спецификацией RFC-6455: полный дуплекс, то есть двусторонняя связь между клиентом и сервером. Это захватывающая особенность. Индустрия давно изучает эту область. Используемые технологии включают Java Applet, Xmlhttprequest, Adobe Flash, ActiveXObject, различные технологии Comet, события отправки на стороне сервера и т. Д.
Следует понимать, что перед использованием протокола WebSocket вам необходимо использовать протокол HTTP для создания начального рукопожатия. Это опирается на механизм - установление HTTP и запрос обновлений протоколов (или преобразования протоколов). Когда сервер соглашается, он будет отвечать на код 101 состояния HTTP, указывая на то, что он соглашается переключить протокол. Предполагая, что успешное рукопожатие через розетки TCP и запрос на обновление протокола HTTP, то и клиент, и сервер могут отправлять сообщения друг другу.
Spring Framework 4.0 и выше представили новый модуль, а именно модуль Spring-Websocket. Он обеспечивает поддержку связи WebSocket. Он совместим со спецификацией API Java Websocket JSR-356, одновременно обеспечивая дополнительную функциональность.
В каком сценарии вы должны использовать WebSocket
В веб -приложениях, когда клиент и сервер должны обмениваться событиями с более высокой частотой и более низкой задержкой, он подходит для WebSocket. Таким образом, WebSocket подходит для сценариев приложений, таких как финансы, игры и сотрудничество.
Это может не подходить для других сценариев применения. Например, подписка на новости требует отображения новостей, и можно также использовать длительный опрос в нескольких минутах друг от друга, и задержка здесь приемлема.
Даже в приложениях, где требуется низкая задержка, если количество передаваемых сообщений очень низкое (например, с отказом от сети мониторинга), следует учитывать технологию длительного опроса.
Только в сценариях с низкой задержкой и высокочастотным сообщением, выбор протокола WebSocket очень подходит. Даже в таком сценарии приложения, возможно ли выбрать общение WebSocket? Или выберите Rest Http Communication?
Ответ заключается в том, что он будет зависеть от потребностей приложения. Тем не менее, также можно использовать эти две технологии одновременно для того, чтобы поместить данные, которые необходимо часто обмениваться в WebSocket, и использовать API REST в качестве технологии реализации бизнеса на основе процессов. Кроме того, когда определенная информация должна транслироваться нескольким клиентам в вызове API REST, она также может быть реализована через подключение к WebSocket.
Spring Framework предоставляет аннотацию @Controller и аннотацию @RestController, которые могут использоваться для обработки HTTP -запросов и обработки сообщений WebSocket. Кроме того, методы обработки запросов Spring MVC или другие методы обработки запросов приложения могут легко использовать протокол WebSocket для трансляции сообщений для всех заинтересованных клиентов или назначенных пользователей.