spring+websocket整合(springMVC+spring+MyBatis即SSM框架和websocket技术的整合)

来源:互联网 发布:网络flash英文歌曲 编辑:程序博客网 时间:2024/05/17 07:03

java-websocket的搭建非常之容易,没用框架的童鞋可以在这里下载撸主亲自调教好的java-websocket程序:

Apach Tomcat 8.0.3+MyEclipse+maven+JDK1.7:

http://download.csdn.net/detail/up19910522/7719087


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.xml中加入websocket所依赖的jar包,什么,你不知道maven,快去度之或者查看撸主关于maven的博文恶补一下,spring-websocket所依赖的jar包有以下几个:

<dependency>    <groupId>javax.servlet</groupId>    <artifactId>javax.servlet-api</artifactId>    <version>3.1.0</version></dependency><dependency>    <groupId>com.fasterxml.jackson.core</groupId>    <artifactId>jackson-core</artifactId>    <version>2.3.0</version></dependency><dependency>    <groupId>com.fasterxml.jackson.core</groupId>    <artifactId>jackson-databind</artifactId>    <version>2.3.0</version></dependency><dependency>   <groupId>org.springframework</groupId>   <artifactId>spring-websocket</artifactId>   <version>4.0.1.RELEASE</version></dependency><dependency>   <groupId>org.springframework</groupId>   <artifactId>spring-messaging</artifactId>   <version>4.0.1.RELEASE</version></dependency>

  • 2 更新web.xml中namespace.xsd的版本,

<beans xmlns="http://www.springframework.org/schema/beans"   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xmlns:websocket="http://www.springframework.org/schema/websocket"   xsi:schemaLocation="        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://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)

<dependency><span style="white-space:pre"></span><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>${spring.version}</version></dependency>

  • 4  4.1创建websocket处理类

package com.up.websocket.handler;import org.springframework.web.socket.TextMessage;import org.springframework.web.socket.WebSocketSession;import org.springframework.web.socket.handler.TextWebSocketHandler;public class WebsocketEndPoint extends TextWebSocketHandler {@Overrideprotected void handleTextMessage(WebSocketSession session,TextMessage message) throws Exception {super.handleTextMessage(session, message);TextMessage returnMessage = new TextMessage(message.getPayload()+" received at server");session.sendMessage(returnMessage);}}

  • 4.2创建握手(handshake)接口

package com.up.websocket;import java.util.Map;import org.springframework.http.server.ServerHttpRequest;import org.springframework.http.server.ServerHttpResponse;import org.springframework.web.socket.WebSocketHandler;import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;public class HandshakeInterceptor extends HttpSessionHandshakeInterceptor{@Overridepublic boolean beforeHandshake(ServerHttpRequest request,ServerHttpResponse response, WebSocketHandler wsHandler,Map<String, Object> attributes) throws Exception {System.out.println("Before Handshake");return super.beforeHandshake(request, response, wsHandler, attributes);}@Overridepublic void afterHandshake(ServerHttpRequest request,ServerHttpResponse response, WebSocketHandler wsHandler,Exception ex) {System.out.println("After Handshake");super.afterHandshake(request, response, wsHandler, ex);}}

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

<bean id="websocket" class="com.up.websocket.handler.WebsocketEndPoint"/><websocket:handlers>    <websocket:mapping path="/websocket" handler="websocket"/>    <websocket:handshake-interceptors>    <bean class="com.up.websocket.HandshakeInterceptor"/>    </websocket:handshake-interceptors></websocket:handlers>


  • 6 客户端页面

<!DOCTYPE html><html><head>    <title>WebSocket/SockJS Echo Sample (Adapted from Tomcat's echo sample)</title>    <style type="text/css">        #connect-container {            float: left;            width: 400px        }        #connect-container div {            padding: 5px;        }        #console-container {            float: left;            margin-left: 15px;            width: 400px;        }        #console {            border: 1px solid #CCCCCC;            border-right-color: #999999;            border-bottom-color: #999999;            height: 170px;            overflow-y: scroll;            padding: 5px;            width: 100%;        }        #console p {            padding: 0;            margin: 0;        }    </style>    <script src="http://cdn.sockjs.org/sockjs-0.3.min.js"></script>    <script type="text/javascript">        var ws = null;        var url = null;        var transports = [];        function setConnected(connected) {            document.getElementById('connect').disabled = connected;            document.getElementById('disconnect').disabled = !connected;            document.getElementById('echo').disabled = !connected;        }        function connect() {        alert("url:"+url);            if (!url) {                alert('Select whether to use W3C WebSocket or SockJS');                return;            }            ws = (url.indexOf('sockjs') != -1) ?                 new SockJS(url, undefined, {protocols_whitelist: transports}) : new WebSocket(url);            ws.onopen = function () {                setConnected(true);                log('Info: connection opened.');            };            ws.onmessage = function (event) {                log('Received: ' + event.data);            };            ws.onclose = function (event) {                setConnected(false);                log('Info: connection closed.');                log(event);            };        }        function disconnect() {            if (ws != null) {                ws.close();                ws = null;            }            setConnected(false);        }        function echo() {            if (ws != null) {                var message = document.getElementById('message').value;                log('Sent: ' + message);                ws.send(message);            } else {                alert('connection not established, please connect.');            }        }        function updateUrl(urlPath) {            if (urlPath.indexOf('sockjs') != -1) {                url = urlPath;                document.getElementById('sockJsTransportSelect').style.visibility = 'visible';            }            else {              if (window.location.protocol == 'http:') {                  url = 'ws://' + window.location.host + urlPath;              } else {                  url = 'wss://' + window.location.host + urlPath;              }              document.getElementById('sockJsTransportSelect').style.visibility = 'hidden';            }        }        function updateTransport(transport) {        alert(transport);          transports = (transport == 'all') ?  [] : [transport];        }                function log(message) {            var console = document.getElementById('console');            var p = document.createElement('p');            p.style.wordWrap = 'break-word';            p.appendChild(document.createTextNode(message));            console.appendChild(p);            while (console.childNodes.length > 25) {                console.removeChild(console.firstChild);            }            console.scrollTop = console.scrollHeight;        }    </script></head><body><noscript><h2 style="color: #ff0000">Seems your browser doesn't support Javascript! Websockets     rely on Javascript being enabled. Please enable    Javascript and reload this page!</h2></noscript><div>    <div id="connect-container">        <input id="radio1" type="radio" name="group1" onclick="updateUrl(''/spring-websocket-uptest/websocket');">            <label for="radio1">W3C WebSocket</label>        <br>        <input id="radio2" type="radio" name="group1" onclick="updateUrl('/spring-websocket-uptest/websocket');">            <label for="radio2">SockJS</label>        <div id="sockJsTransportSelect" style="visibility:hidden;">            <span>SockJS transport:</span>            <select onchange="updateTransport(this.value)">              <option value="all">all</option>              <option value="websocket">websocket</option>              <option value="xhr-polling">xhr-polling</option>              <option value="jsonp-polling">jsonp-polling</option>              <option value="xhr-streaming">xhr-streaming</option>              <option value="iframe-eventsource">iframe-eventsource</option>              <option value="iframe-htmlfile">iframe-htmlfile</option>            </select>        </div>        <div>            <button id="connect" onclick="connect();">Connect</button>            <button id="disconnect" disabled="disabled" onclick="disconnect();">Disconnect</button>        </div>        <div>            <textarea id="message" style="width: 350px">Here is a message!</textarea>        </div>        <div>            <button id="echo" onclick="echo();" disabled="disabled">Echo message</button>        </div>    </div>    <div id="console-container">        <div id="console"></div>    </div></div></body></html>


  • 7  按照以上步骤搭建,根据个人开发环境不同,可能会出现各种问题,下面将在整个搭建过程中遇到的问题总结一下,详见博文:http://blog.csdn.net/gisredevelopment/article/details/38397569



演示实例增强版下载:spring-websocket-uptest.rar

尊重原创,转载请注明出处:

http://blog.csdn.net/gisredevelopment/article/details/38392629


技术邮箱,免费答疑:897658573@qq.com






50 6
原创粉丝点击