你的位置:首页 > ASP.net教程

[ASP.net教程]spring+websocket整合(springMVC+spring+MyBatis即SSM框架)


spring4.0以后加入了对websocket技术的支持,撸主目前的项目用的是SSM(springMVC+spring+MyBatis)框

架,所以肯定要首选spring自带的websocket了,好,现在问题来了,撸主在网上各种狂搜猛找,拼凑了几个自称是

spring websocket的东东,下来一看,废物,其中包括从github上down下来的。举个例子,在搭建过程中有个问题,

撸主上谷歌搜索,总共搜出来三页结果共30条左右,前15条是纯英文的  后15条是韩语和日语,而这30条结果都不能

解决撸主的问题,无奈,只好上官网看全英帮助,在撸主惊人的毅力和不懈奋斗下,纠结了两天的spring+websocket

整合今天算是彻底搭建成功,摸索透彻了。

websocket是目前唯一真正实现全双工通信的服务器向客户端推的互联网技术,与长连接和轮询技术相比,

websocket的优越性不言自明,长连接的连接资源(线程资源)随着连接数量的增多,必会耗尽,客户端轮询会给服

务器造成很大的压力,而websocket是在物理层非网络层建立一条客户端至服务器的长连接,以此来保证服务器向客

户端的即时推送,既不耗费线程资源,又不会不断向服务器轮询请求。

下面言归正传,讲一讲撸主在SSM(springMVC+spring+MyBatis)框架中集成websocket技术的曲折蛋疼直至成功喜悦之路。

  • 1 在maven的pom.

 

[html] view plaincopyprint?在CODE上查看代码片派生到我的代码片

  1. <dependency>  

  2.     <groupId>javax.servlet</groupId>  

  3.     <artifactId>javax.servlet-api</artifactId>  

  4.     <version>3.1.0</version>  

  5. </dependency>  

  6. <dependency>  

  7.     <groupId>com.faster

  8.     <artifactId>jackson-core</artifactId>  

  9.     <version>2.3.0</version>  

  10. </dependency>  

  11. <dependency>  

  12.     <groupId>com.faster

  13.     <artifactId>jackson-databind</artifactId>  

  14.     <version>2.3.0</version>  

  15. </dependency>  

  16. <dependency>  

  17.    <groupId>org.springframework</groupId>  

  18.    <artifactId>spring-websocket</artifactId>  

  19.    <version>4.0.1.RELEASE</version>  

  20. </dependency>  

  21. <dependency>  

  22.    <groupId>org.springframework</groupId>  

  23.    <artifactId>spring-messaging</artifactId>  

  24.    <version>4.0.1.RELEASE</version>  

  25. </dependency>  

  • 2 更新web.

 

[html] view plaincopyprint?在CODE上查看代码片派生到我的代码片

  1. <beans 

  2.        

  3.        

  4.        xsi:schemaLocation="  

  5.         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd  

  6.         http://www.springframework.org/schema/websocket http://www.springframework.org/schema/websocket/spring-websocket.xsd">  

  • 3 更新spring框架的jar包至4.0以上(spring-core, spring-context, spring-web and spring-webmvc)

 

[html] view plaincopyprint?在CODE上查看代码片派生到我的代码片

  1. <dependency>  

  2. <span >    </span><groupId>org.springframework</groupId>  

  3.     <artifactId>spring-core</artifactId>  

  4.     <version>${spring.version}</version>  

  5. </dependency>  

  6. <dependency>  

  7.     <groupId>org.springframework</groupId>  

  8.     <artifactId>spring-web</artifactId>  

  9.     <version>${spring.version}</version>  

  10. </dependency>  

  11. <dependency>  

  12.     <groupId>org.springframework</groupId>  

  13.     <artifactId>spring-webmvc</artifactId>  

  14.     <version>${spring.version}</version>  

  15. </dependency>  

  16. <dependency>  

  17.     <groupId>org.springframework</groupId>  

  18.     <artifactId>spring-context-support</artifactId>  

  19.     <version>${spring.version}</version>  

  20. </dependency>  

  • 4  4.1创建websocket处理类

 

[html] view plaincopyprint?在CODE上查看代码片派生到我的代码片

  1. package com.up.websocket.handler;  

  2.   

  3. import org.springframework.web.socket.TextMessage;  

  4. import org.springframework.web.socket.WebSocketSession;  

  5. import org.springframework.web.socket.handler.TextWebSocketHandler;  

  6.   

  7. public class WebsocketEndPoint extends TextWebSocketHandler {  

  8.   

  9.     @Override  

  10.     protected void handleTextMessage(WebSocketSession session,  

  11.             TextMessage message) throws Exception {  

  12.         super.handleTextMessage(session, message);  

  13.         TextMessage returnMessage = new TextMessage(message.getPayload()+" received at server");  

  14.         session.sendMessage(returnMessage);  

  15.     }  

  16. }  

  • 4.2创建握手(handshake)接口

 

[html] view plaincopyprint?在CODE上查看代码片派生到我的代码片

  1. package com.up.websocket;  

  2.   

  3. import java.util.Map;  

  4.   

  5. import org.springframework.http.server.ServerHttpRequest;  

  6. import org.springframework.http.server.ServerHttpResponse;  

  7. import org.springframework.web.socket.WebSocketHandler;  

  8. import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;  

  9.   

  10. public class HandshakeInterceptor extends HttpSessionHandshakeInterceptor{  

  11.   

  12.     @Override  

  13.     public boolean beforeHandshake(ServerHttpRequest request,  

  14.             ServerHttpResponse response, WebSocketHandler wsHandler,  

  15.             Map<String, Object> attributes) throws Exception {  

  16.         System.out.println("Before Handshake");  

  17.         return super.beforeHandshake(request, response, wsHandler, attributes);  

  18.     }  

  19.   

  20.     @Override  

  21.     public void afterHandshake(ServerHttpRequest request,  

  22.             ServerHttpResponse response, WebSocketHandler wsHandler,  

  23.             Exception ex) {  

  24.         System.out.println("After Handshake");  

  25.         super.afterHandshake(request, response, wsHandler, ex);  

  26.     }  

  27.   

  28. }  

 

  • 5 处理类和握手协议的spring配置(applicationContext.

 

[html] view plaincopyprint?在CODE上查看代码片派生到我的代码片

  1. <bean id="websocket" />  

  2.   

  3. <websocket:handlers>  

  4.     <websocket:mapping path="/websocket" handler="websocket"/>  

  5.     <websocket:handshake-interceptors>  

  6.     <bean />  

  7.     </websocket:handshake-interceptors>  

  8. </websocket:handlers>  

 

  • 6 客户端页面

 

[html] view plaincopyprint?在CODE上查看代码片派生到我的代码片

  1. <!DOCTYPE html>  

  2. <html>  

  3. <head>  

  4.     <title>WebSocket/SockJS Echo Sample (Adapted from Tomcat's echo sample)</title>  

  5.     <style type="text/css">  

  6.         #connect-container {  

  7.             float: left;  

  8.             width: 400px  

  9.         }  

  10.   

  11.         #connect-container div {  

  12.             padding: 5px;  

  13.         }  

  14.   

  15.         #console-container {  

  16.             float: left;  

  17.             margin-left: 15px;  

  18.             width: 400px;  

  19.         }  

  20.   

  21.         #console {  

  22.             border: 1px solid #CCCCCC;  

  23.             border-right-color: #999999;  

  24.             border-bottom-color: #999999;  

  25.             height: 170px;  

  26.             overflow-y: scroll;  

  27.             padding: 5px;  

  28.             width: 100%;  

  29.         }  

  30.   

  31.         #console p {  

  32.             padding: 0;  

  33.             margin: 0;  

  34.         }  

  35.     </style>  

  36.   

  37.     <script src="http://cdn.sockjs.org/sockjs-0.3.min.js"></script>  

  38.   

  39.     <script type="text/javascript">  

  40.         var ws = null;  

  41.         var url = null;  

  42.         var transports = [];  

  43.   

  44.         function setConnected(connected) {  

  45.             document.getElementById('connect').disabled = connected;  

  46.             document.getElementById('disconnect').disabled = !connected;  

  47.             document.getElementById('echo').disabled = !connected;  

  48.         }  

  49.   

  50.         function connect() {  

  51.             alert("url:"+url);  

  52.             if (!url) {  

  53.                 alert('Select whether to use W3C WebSocket or SockJS');  

  54.                 return;  

  55.             }  

  56.   

  57.             ws = (url.indexOf('sockjs') != -1) ?   

  58.                 new SockJS(url, undefined, {protocols_whitelist: transports}) : new WebSocket(url);  

  59.   

  60.             ws.onopen = function () {  

  61.                 setConnected(true);  

  62.                 log('Info: connection opened.');  

  63.             };  

  64.             ws.onmessage = function (event) {  

  65.                 log('Received: ' + event.data);  

  66.             };  

  67.             ws.onclose = function (event) {  

  68.                 setConnected(false);  

  69.                 log('Info: connection closed.');  

  70.                 log(event);  

  71.             };  

  72.         }  

  73.   

  74.         function disconnect() {  

  75.             if (ws != null) {  

  76.                 ws.close();  

  77.                 ws = null;  

  78.             }  

  79.             setConnected(false);  

  80.         }  

  81.   

  82.         function echo() {  

  83.             if (ws != null) {  

  84.                 var message = document.getElementById('message').value;  

  85.                 log('Sent: ' + message);  

  86.                 ws.send(message);  

  87.             } else {  

  88.                 alert('connection not established, please connect.');  

  89.             }  

  90.         }  

  91.   

  92.         function updateUrl(urlPath) {  

  93.             if (urlPath.indexOf('sockjs') != -1) {  

  94.                 url = urlPath;  

  95.                 document.getElementById('sockJsTransportSelect').style.visibility = 'visible';  

  96.             }  

  97.             else {  

  98.               if (window.location.protocol == 'http:') {  

  99.                   url = 'ws://' + window.location.host + urlPath;  

  100.               } else {  

  101.                   url = 'wss://' + window.location.host + urlPath;  

  102.               }  

  103.               document.getElementById('sockJsTransportSelect').style.visibility = 'hidden';  

  104.             }  

  105.         }  

  106.   

  107.         function updateTransport(transport) {  

  108.             alert(transport);  

  109.           transports = (transport == 'all') ?  [] : [transport];  

  110.         }  

  111.           

  112.         function log(message) {  

  113.             var console = document.getElementById('console');  

  114.             var p = document.createElement('p');  

  115.             p.style.wordWrap = 'break-word';  

  116.             p.appendChild(document.createTextNode(message));  

  117.             console.appendChild(p);  

  118.             while (console.childNodes.length > 25) {  

  119.                 console.removeChild(console.firstChild);  

  120.             }  

  121.             console.scrollTop = console.scrollHeight;  

  122.         }  

  123.     </script>  

  124. </head>  

  125. <body>  

  126. <noscript><h2 >Seems your browser doesn't support Javascript! Websockets   

  127.     rely on Javascript being enabled. Please enable  

  128.     Javascript and reload this page!</h2></noscript>  

  129. <div>  

  130.     <div id="connect-container">  

  131.         <input id="radio1" type="radio" name="group1" onclick="updateUrl(''/spring-websocket-uptest/websocket');">  

  132.             <label for="radio1">W3C WebSocket</label>  

  133.         <br>  

  134.         <input id="radio2" type="radio" name="group1" onclick="updateUrl('/spring-websocket-uptest/websocket');">  

  135.             <label for="radio2">SockJS</label>  

  136.         <div id="sockJsTransportSelect" >  

  137.             <span>SockJS transport:</span>  

  138.             <select onchange="updateTransport(this.value)">  

  139.               <option value="all">all</option>  

  140.               <option value="websocket">websocket</option>  

  141.               <option value="xhr-polling">xhr-polling</option>  

  142.               <option value="jsonp-polling">jsonp-polling</option>  

  143.               <option value="xhr-streaming">xhr-streaming</option>  

  144.               <option value="iframe-eventsource">iframe-eventsource</option>  

  145.               <option value="iframe-htmlfile">iframe-htmlfile</option>  

  146.             </select>  

  147.         </div>  

  148.         <div>  

  149.             <button id="connect" onclick="connect();">Connect</button>  

  150.             <button id="disconnect" disabled="disabled" onclick="disconnect();">Disconnect</button>  

  151.         </div>  

  152.         <div>  

  153.             <textarea id="message" >Here is a message!</textarea>  

  154.         </div>  

  155.         <div>  

  156.             <button id="echo" onclick="echo();" disabled="disabled">Echo message</button>  

  157.         </div>  

  158.     </div>  

  159.     <div id="console-container">  

  160.         <div id="console"></div>  

  161.     </div>  

  162. </div>  

  163. </body>  

  164. </html>  

 整理的比较粗略,将代码分享给大家,【源码地址获取】