이 기사에는 세 가지 주요 단계가 있습니다
1. 사용자가 로그인 한 후 WebSocket 연결을 설정하십시오. 기본 선택이 선택됩니다. 브라우저가 지원하지 않으면 SOCKJS를 사용하여 연결을 시뮬레이션하십시오.
2. 연결을 설정 한 후 서버는 사용자의 읽지 않은 메시지를 반환합니다.
3. 서버가 관련 작업을 수행 한 후 새 메시지를 특정 사용자 또는 모든 사용자에게 푸시하십시오. Spring 4.0.6 (Select 4.0+), Tomcat7.0.55
WebSocet 서버 구현
WebSocketConfig.java
@configuration@enableWebmvc@enableWebSocketCocketCocketCocketConfig 확장 webmvcconfigureradapter websocketConfigurer {@overridepublic void registerWebSocketHandlers (webSocketHandlerRegistrestrestrestrestrestrestrestrestandler) {registry.addHandller (SystemWeckethandler ()). websockethandshakeinterceptor ()); registry.addhandler (systemwebsockethandler (), "/sockjs/websocketserver").addinterceptors(new websockethandshakeinterceptor ()). thesockjs ();}@beanpublic websockethandler systemwethandler () {recSpringMVC의 구성 파일 에서이 클래스의 자동 스캔을 구성하는 것을 잊지 마십시오.
<context : component-scan base-package = "com.ldl.origami.websocket" />
@구성
@enablewebmvc
@enablewebsocket
이 세 가지는이 클래스가 @Bean 모드에서 콩을 로딩하는 것을 지원하고 SpringMVC 및 WebSocket을 지원한다는 것을 의미합니다. 그다지 정확하지 않습니다. 추가하지 않고 @enablewebmvc를 시도했는데 @Configuration은 원래 SpringMVC의 자동 스캔을 지원합니다.
registry.addhandler (SystemWebsocketHandler (), "/websocketServer"). AddInterceptor (새로운 WebSocketHandshakeInterceptor ())
WebSocket Server 구현 클래스를 등록하는 데 사용됩니다. 두 번째 매개 변수는 WebSocket 주소에 액세스하는 것입니다.
registry.addhandler (SystemWebSocketHandler (), "/sockjs/websocketServer").addinterceptors(new websockethandshakeinterceptor ()). withsockjs ();}
이것은 sockjs를 사용하는 등록 방법입니다
첫 번째 SystemWebsocketHandler.java
Public Class Systemwebsockethandler는 WebSocketHandler를 구현합니다. {private static final logger; private static final logger; private static final arraylist <websocketsession> users; static {user = new arraylist <> (); logger = loggerfactory.getLogger (SystemWebSocketHandler.class);@autoweriedpublic void; AfterConnectionStablish (WebsocketSession Session)은 예외 {logger.debug ( "WebSocket 성공에 연결 ..."); user.add (session); String username = (string) session.getAttributes (). get (constants.websocket_username); if (username! = null) {// websocketservice. session.getAttributes (). get (constants.websocket_username); session.sendMessage (new TextMessage (count + ""));}}}}@atredepublic void handlemessage (websocketSession session, webSocketSession <?> 메시지) 예외 {// sendMessAgetousers (); handletransporterror (websocketsession session, trashable excepter)는 예외를 던져 {if (session.isopen ()) {session.close ();} logger.debug ( "Websocket Connection 닫았다 ......"); users.remove (session);}@websocketSession sethows 예외) {logger.debug ( "WebSocket Connection 닫았습니다 ..."); user.remove (session);} @atrementpublic boolean supportspartialmessages () {return false;}/*** 모든 온라인 사용자에게 메시지 보내기 ** @param message*/public void sendmessagetousers (textMessage message) {websocketSession user (user) {if (user) {if user. {user.sendmessage (messag (user.getAttributes ().관련 내용을 한눈에 이해할 수 있으므로 설명하지 않을 것입니다.
그런 다음 websockethandshakeinterceptor.java
공개 클래스 Websockethandshakeinterceptor는 Handshakeinterceptor를 구현합니다. {private static logger = loggerfactory.getLogger (handshakeinterceptor.class);@atredridepublic boolean firedhandshake (serverhttprequest 요청, serverhttprons 응답, websockethandler, map <string). servletserverhttprequest) {servletserverhttprequest servletrequest = (servletserverhttprequest) 요청; httpsession session = servletrequest.getServletRequest (). getsession (false); if (session! = null) {// useconder indering indersingal to at onder websokethondler를 사용하여 username을 사용합니다. (문자열) session.getAttribute (constants.session_username); Attributes.put (constants.websocket_username, username);}} return true;}@atrivePublic void affhandshake (serverhttprequest request, serverhttpresponse 응답, websockethandler wshandler, 예외 예외) {}}이것의 주요 기능은 현재 요청에서 사용자 이름을 얻고 현재 Websockethandler에 해당 사용자를 결정하기 위해 현재 Websockethandler에 저장하는 것입니다. 자세한 내용은 httpsessionHandshakeinterceptor를 참조하십시오
사용자 로그인 WebSocket 연결을 설정합니다
index.jsp
<script type = "text/javaScript"src = "http : // localhost : 8080/종이 접기/websocket/sockjs-0.3.min.js"> </script> <cript> var websocket; if (Websocket '{Websocket') ( 'Window의'Mozwebsocket ') {WebSocket = New MozwebSocket ( "ws : // localhost : 8080/igrami/websocketserver");} else {websocket = new sockjs ( "http : // localhost : 8080/igrami/sockjs/websocketserver"); {}; webSocket.onMessage = function (evnt) {$ ( "#msgcount"). html ( "(<font color = 'red'>"+evnt.data+"</font>)"}}; webSocke.onerror = function (evnt)}; webSocket.onclose = function (evnt)}SOCKJS를 사용할 때주의하십시오
1.이 두 가지를 쓰는 방법
<script type = "text/javaScript"src = "http : // localhost : 8080/종이 접기/Websocket/Sockjs-0.3.min.js"> </script> webSocket = new Sockjs (http : // localhost : 8080/종이 접시/setbjs/sockjs/sockjs/setchetServer);
2. web.xml에서
<Web-App 버전 = "3.0" xmlns = "http://java.sun.com/xml/ns/javaee"xmlns : xsi = "http://www.w3.org/2001/xmlschema-instance"xsi : schemalocation = "http://java.sun.com/xml/n/ns/ns. http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd ">
버전
Web-App_3_1.xsd
두 버전 모두 3.0+ 여야합니다
그런 다음이 서블릿에 추가하십시오
<Async-Supported> true </async-supported> <servlet> <servlet-name> appservlet </servlet-name> <servlet-class> org.sprameframework.serb.servlet.dispatcherservlet </servlet-class> <init-param> <param-name > ContextConfigLocation </param-name> <param- value> classpath*: servlet-context.xml </param- value> </init-param> <load-on-startup> 1 </load-on-startup> <sync-supported> true </async-supported> </servlet>
그런 다음 모든 필터가 추가됩니다
<비동기 지원> true </async-supported>
3. 관련 종속성을 추가하십시오
<pectionency> <groupid> com.fasterxml.jackson.core </groupid> <artifactid> jackson-nantations </artifactid> <bersion> 2.3.0 </version> <pectomency> <groupid> com.fasterxml.jackson.core </groupid> <artifa CTID> Jackson-Core </artifactid> <bersion> 2.3.1 </version> </dependency> <prection> <groupid> com.fasterxml.jackson.core </group-databind </artifactid> <3.3 </versionency>
이제 WebSocket을 정상적으로 설정할 수 있습니다
사용자의 읽지 않은 메시지를 반환합니다
연결이 설정되면 SystemWebsocketHandler의 AfterconnectionEstableded 방법이 입력됩니다. 위의 코드를보고 WebSocketHandshakeInterceptor에 저장된 사용자 이름을 꺼내십시오.
정보를 쿼리 한 후 Session.SendMessage를 사용합니다 (New TextMessage (count + "")); 사용자에게 반환하고 돌아가서 가십시오.
서버의 사용자에게 메시지를 푸시합니다
@ControllerPublic 클래스 AdminController {정적 로거 로거 = loggerFactory.getLogger (AdminController.class);@autowired (필수 = false) private adminservice adminservice; @BeanPublic SystemWebSocketHEDLLER SYSTEMWEBSOCHETHANDLER () {return new SystemWebSocketHandler ();}@requestMapping ( "/auditing")@responseBodyPublic String Auditing (httpservletRequest request) {// int unreadnewscount = adminservice.getUnreadnews (username); SystemWebsocketHandler (). SendMessAgetouser (useRername, unreadnewscount + "); 결과;}}여기에서 sendMessAgetouser를 사용하여 사용자에게 정보를 푸시하거나 SendMessAgetousers를 사용하여 모든 사용자에게 정보를 푸시 할 수 있습니다.