В этой статье есть три основных шага
1. После входа пользователя входит в систему, установите соединение WebSocket. Выбор по умолчанию выбран. Если браузер не поддерживает его, используйте Sockjs для моделирования соединения.
2. После установления соединения сервер возвращает нечитанное сообщение пользователя.
3. После того, как сервер выполняет соответствующие операции, выдвините новые сообщения для определенного пользователя или всех пользователей. Весна 4.0.6 (выберите 4.0+), Tomcat7.0.55
Реализация Веб -Соцет Сервер
Websocketconfig.java
@Configuration@enablewebmvc@enablewebsocketpublic class websocketconfig extends webmvcconfigureradapter реализует websocketconfigurer {@overridepublic void registerswebothandlers (webockethandlerregistry registry) {registry.addhandler (SystemWebSocketHandler (). WebSocketHandshakeInterceptor());registry.addHandler(systemWebSocketHandler(), "/sockjs/webSocketServer").addInterceptors(new WebSocketHandshakeInterceptor()).withSockJS();}@Beanpublic WebSocketHandler systemWebSocketHandler(){return new SystemWebSocketHandler();}}Не забудьте настроить автоматическое сканирование этого класса в файле конфигурации SpringMVC
<Контекст: компонент-сканирование Base-package = "com.ldl.origami.websocket" />
@Configuration
@Enablewebmvc
@Enablewebsocket
Эти три примерно означают, что этот класс поддерживает загрузку бобов в режиме @Bean и поддерживает SpringMVC и WebSocket. Это не очень точно. Я попробовал @enablewebmvc, не добавляя его, и @configuration изначально поддерживает автоматическое сканирование Springmvc
Registry.addhandler (SystemWebSockethandler (), "/websocketserver"). AddInterceptors (New WebSockethandshakeInterceptor ())
Используется для регистрации класса реализации сервера WebSocket. Второй параметр - доступ к адресу WebSocket.
Registry.addhandler (SystemWebSockethandler (), "/sockjs/websocketserver").addinterceptors(new websockethandshakeinterceptor ()). withsockjs ();}
Это метод регистрации с использованием sockjs
First SystemWebSockethandler.java
public class SystemWebSocketHandler implements WebSocketHandler {private static final Logger logger;private static final ArrayList<WebSocketSession> users;static {users = new ArrayList<>();logger = LoggerFactory.getLogger(SystemWebSocketHandler.class);}@Autowiredprivate WebSocketService webSocketService;@Overridepublic void AfterConnectionESTABLED (SESSOCKETSENSESSION) THROHS Exception {logger.debug («Подключите к успеху WebSocket ...»); Users.Add (Session); String username = (String) session.getAttributes (). get (constants.websocket_username); if (username! session.getattributes (). get (constants.websocket_username)); session.sendmessage (new TextMessage (count + ""));}}@overridepublic void handlemessage (сеанс WebSocketSession, websocketCocketMess <?> handletransporterror (сеанс WebSocketSession, бросающий исключение) бросает Exception {if (session.isopen ()) {session.close ();} logger.debug ("websocket connection closed ......"); users.remove (session);}@opplypublic void void после confodectoscessessessed (websocketsession sesvicessession sesvicessession). {logger.debug("websocket connection closed...");users.remove(session);}@Overridepublic boolean supportsPartialMessages() {return false;}/*** Send message to all online users** @param message*/public void sendMessageToUsers(TextMessage message) {for (WebSocketSession user : users) {try {if (user.isOpen()) {user.sendmessage (message);}} catch (ioexception e) {e.printstacktrace ();}}}/*** Отправить сообщение пользователю ** @param username*@param message*/public void sendmessageter (String usname, текстовое сообщение) (user.getattributes (). get (constants.websocket_username) .equals (username)) {try {if (user.isopen ()) {user.sendmessage (сообщение);}} catch (ioexception e) {e.printstacktrace ();} break;}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}Вы можете с первого взгляда понимать соответствующий контент, поэтому я не буду много объяснять его
Затем WebSockethandshakeInterceptor.java
Открытый класс WebSockethandShakeInterceptor реализует ручную работы {private static logger = loggerfactory.getlogger (handshakeinterceptor.class);@overridepublic boolean заранее (Serverhttprequest, запрос Attributes attripponse excence -excence -exection -insection -insections aTrows). ServletServerhttprequest) {ServletServerhttprequest servletRequest = (ServletServerhttprequest); httpsession session = servletrequest.getservletrequest (). Getsession (false); Если (сеанс! (String) session.getAttribute (constants.session_username); attributes.put (constants.websocket_username, username);}} return true;}@overridepublic void udathandshake (serverhttprequest requent, serverhttpresponse response, websockethandler wshandler, исключение исключения) {}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}Основная функция этого состоит в том, чтобы получить имя пользователя в текущем запросе и сохранить его в текущий веб -сайт, чтобы определить соответствующего пользователя в WebSockethandler. Для получения подробной информации, пожалуйста, обратитесь к httpsessionhandshakeinterceptor
Пользовательский вход для создания подключения к WebSocket
index.jsp
<script type = "text/javascript" src = "http: // localhost: 8080/Origami/websocket/sockjs-0.3.min.js"> </script> <script> var websocket; if ('websocket' in windows) {websocket = websocket ("ws: // localhost: 8080/Origania webSocketVerVer webSocketVerVEREVEREVEREVEREVEREVE ('Mozwebsocket' в Window) {websocket = new Mozwebsocket ("ws: // localhost: 8080/ourigami/websocketserver");} else {websocket = new sockjs ("http: // localhost: websope.onop.onop.onop.onop.onop.onop.onop.onop.onop.onop.onop.onop. {}; websocket.onmessage = function (evnt) {$ ("#msgcount"). html ("(<font color = 'red'>"+evnt.data+"</font>)")}; websocket.onerror = function (evnt) {}; websocke.onclose = function (evnt) {/script> script> script> script> script> script> script> script> script> script> script> scrБудьте осторожны при использовании sockjs
1. Как написать эти два
<script type = "text/javascript" src = "http: // localhost: 8080/Origami/websocket/sockjs-0.3.min.js"> </script> websocket = new Sockjs (http: // localhost: 8080/ourmami/sockjs/webocketerver);
2. В web.xml
<web-app version = "3.0" xmlns = "http://java.sun.com/xml/ns/javaee" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: schemalocation = "http://java.sun.commlocation http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd ">
Версия
web-app_3_1.xsd
Обе версии должны быть 3,0+
Затем добавьте его в этот сервлет
<Sync-подержанный> true </async-подержанный> <servlet> <servlet-name> appservlet </servlet-name> <serlet-class> org.springframework.web.servlet.dispatcherservlet </servlet-class> <init-param> <param-name > ContextConfiglocation </param-name> <param-value> classPath*: servlet-context.xml </param-value> </init-param> <dut-on-startup> 1 </load-on-startup> <sync-supported> true </async-supped> </servlet>
Тогда добавляются все фильтры
<Async-поддержка> true </async-поддерживаемое>
3. Добавить связанные зависимости
<depervice> <groupid> com.fasterxml.jackson.core </GroupId> <artifactid> jackson-annotations </artifactid> <serse> 2.3.0 </version> </depertive> <DeyEdency> <groupId> com.fasterxml.jackson.core </Groupid> <artifa ctid> jackson-core </artifactid> <sersion> 2.3.1 </version> </dependency> <Depective> <groupId> com.fasterxml.jackson.core </GroupId> <artifactid> jackson-databind </artifactid> <serse> 2.3.3 </version> </deployend>
Хорошо, теперь веб -сокет может быть установлен нормально
Возвращает непрочитанное сообщение пользователя
После того, как соединение будет установлено, будет введен метод SystemWebSockethandler, созданный после ConconnectionSection. Посмотрите на код выше и выньте имя пользователя, сохраненное в WebSockethandshakeinterceptor
После запроса информации используйте session.sendmessage (new Textmessage (count + "" ")); Чтобы вернуть его пользователю и вернуться и вернуться.
Нажмите сообщения пользователям на сервере
@Controllerpublic class admincontroller {static logger logger = loggerfactory.getlogger (admincontroller.class);@autowovired (обязательный = false) Частный Adminservice Adminservice; @beanpublic systemwebockethandler SystemWebSockethandler () {return New SystemWebSocketHandler();}@RequestMapping("/auditing")@ResponseBodypublic String auditing(HttpServletRequest request){//Int unReadNewsCount = adminService.getUnReadNews(username);systemWebSocketHandler().sendMessageToUser(username, new TextMessage(unReadNewsCount + ""));return результат;}}Здесь вы можете использовать SendMessageToureser для разжигания информации пользователю, или вы можете использовать SendMessageToursers для разжигания информации для всех пользователей.