spring+websocket综合(springMVC+spring+MyBatis这是SSM框架和websocket集成技术)

java-websocket该建筑是easy。儿童无用的框架可以在这里下载主线和个人教学好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是眼下唯一真正实现全双工通信的server向client推的互联网技术,与长连接和轮询技术相比,

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

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

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

以下言归正传,讲一讲撸主在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 client页面

<!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" οnclick="updateUrl(''/spring-websocket-uptest/websocket');"> <label for="radio1">W3C WebSocket</label> <br> <input id="radio2" type="radio" name="group1" οnclick="updateUrl('/spring-websocket-uptest/websocket');"> <label for="radio2">SockJS</label> <div id="sockJsTransportSelect" style="visibility:hidden;"> <span>SockJS transport:</span> <select οnchange="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" οnclick="connect();">Connect</button> <button id="disconnect" disabled="disabled" οnclick="disconnect();">Disconnect</button> </div> <div> <textarea id="message" style="width: 350px">Here is a message!</textarea> </div> <div> <button id="echo" οnclick="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






版权声明:本文博客原创文章,博客,未经同意,不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/459950.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电子计算机可直接执行的指令机器内部是以,电子计算机可直接执行的指令在机器内部是以( )表示....

问题&#xff1a;电子计算机可直接执行的指令在机器内部是以( )表示.更多相关问题实际GDP衡量的是在特定年度内生产的最终产品与服务的价值&#xff0c;使用________。A&#xff0e;基年价格B&#xff0e;当年价格C&#xff0e;岗位评价结果的形式多种多样&#xff0c;但最值得…

Audit(查看审核/审计信息)

2013需要到 网站集管理-网站集审核设置 中设置要开启的审核项&#xff0c;开启之后sharepoint才会记录信息&#xff0c;信息存储在contentDB的AuditData中&#xff1b; 去读审计信息的sharepoint代码如下&#xff1a; 1 using (SPSite site new SPSite(SiteUrl))2 {3 usin…

jtoken判断是否包含键_Redis 数据库、键过期的实现

今天看看作为内存数据库&#xff0c;Redis 是怎么存储数据的以及键是怎么过期的。阅读这篇文章你将会了解到&#xff1a;Redis 的数据库实现Redis 键过期的策略数据库的实现我们先看代码 server.h/redisServerstruct redisServer{ ... //保存 db 的数组 redisDb *db; //db 的数…

JBoss配置详解

为什么80%的码农都做不了架构师&#xff1f;>>> 2.0.1 JBOSS 的一点说明 $JBOSS-HOME/server/下有3个目录&#xff0c;all/default/minimal&#xff0c;它们是表示3种配置&#xff0c;全部的配置、默认配置、最小配置&#xff0c;我们在启动JBOSS服务时&#xff0c…

计算机等级考试2010,2010年全国计算机等级考试相关政策

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼二级QBASIC 21 120 60二级FORTRAN 22 120 60 不接受新考生报名二级C 24 120 60二级FOXBASE 25 120 60二级VB 26 90 90二级VFP 27 90 90三级PC技术 33 120 60三级信息管理技术 34 120 60三级网络技术 35 120 60三级数据库技术 36 12…

ACE(Adaptive Communication Environment)介绍

转自 http://blog.csdn.net/huangyong19870618/article/details/4954512 Adaptive Communication Environment&#xff08;自适配通信环境&#xff09;&#xff0c;简称ACE。为一个以C的Template技术所做成的开放源代码的可跨平台的网络应用程序的程序库套件。 相关书籍   T…

rpn产生proposals_一文读懂RPN和ROI Align

rpn和roi align是two-stage detector中比较关键的两个操作&#xff0c;这两个操作将two-stage detector中的两个stage连接起来&#xff0c;变成end-to-end(端到端)的网络&#xff0c;同时也给整个检测方法的性能带来提升。rpn为roi align提供高质量的候选框&#xff0c;即propo…

多个相同参数表单提交

前情提要&#xff1a; 现在需要使用异步提交表单数据&#xff08;QueryString方式&#xff09;&#xff0c;但数据个数比较多&#xff0c;一个个拼接比较麻烦&#xff0c;这时可以使用jQuery的方法$("form").serialize()对表单进行序列化。但是如果这时&#xff0c…

简单仿百度自动搜索框

body中 <body> 请输入搜索内容:<input type"text" name"name" value"" id"txt" style"border:1px solid gray;margin:0;padding:0; width:200px;" /></body> View Code<script>中 <script type&…

layui上传文件请求接口异常_SpringMVC实现文件上传与下载,拦截器,异常处理

第一章&#xff1a;响应数据和结果视图1. 返回字符串Controller方法返回字符串可以指定逻辑视图的名称&#xff0c;根据视图解析器为物理视图的地址。RequestMapping(value"/hello")public String sayHello() {System.out.println("Hello SpringMVC!!");//…

球星测试软件,2KOL球星测评丨篮球之神,迈克尔.乔丹(96版)

迈克尔.乔丹(96版)迈克尔乔丹在在1984年NBA选秀中于第1轮第3位被芝加哥公牛队选中。(他的前面两位分别是哈基姆奥拉朱旺和萨姆鲍伊)91-93赛季&#xff0c;乔丹连续2次荣膺常规赛MVP和3次总决赛FMVP &#xff0c;并率领芝加哥公牛队首夺3连冠。 93年10月6日因父亲被害而宣布退役…

iphone无线充电充电测试软件,瞎折腾星人的测评 篇一:想体验iPhone的无线充电?这可能是最具性价比的选择了!...

瞎折腾星人的测评 篇一&#xff1a;想体验iPhone的无线充电&#xff1f;这可能是最具性价比的选择了&#xff01;2018-11-28 00:26:032点赞2收藏0评论最近恰逢更换新手机&#x1f4f1;iPhone XS Max的重大活动&#xff0c;功臣iPhone 7退居二线&#xff0c;女票突然脑子一热要给…

Gson读写JSON 数据

一、创建实体&#xff1b; package com.bo.entity;public class ShiTiInFo {private String shitia; //试题名称private String shitib; //大题名称private String shitic; //小题名称private String shitid; //试题题号private int shitie; //试题小号public String getShitia…

poj 2431

大意&#xff1a; 有n个加油点&#xff0c;给出每个加油点距离终点的位置和能加多少油&#xff0c;最后一行给出总长度和最初的油量。求最少加几次油能到终点&#xff0c;不能到的话输出-1. Sample Input 4 4 4 5 2 11 5 15 10 25 10Sample Output 2分析&#xff1a; 一开始打算…

cts游戏手机版_cts游戏

cts游戏是一款非常逼真的驾驶模拟游戏&#xff0c;它以经典的驾驶和运输为主题&#xff0c;通往不同城市拥有不同的运输路线玩家们可以在驾驶过程中欣赏风景&#xff0c;感受全新的天气变化&#xff0c;当天气不好会影响驾驶&#xff0c;玩家需要小心驾驶。确保货物安全发送到指…

服务器系统server 2008,windows server 2008 R2 操作系统

您好&#xff0c;您的问题解决了吗&#xff1f;如果回复对您有所帮助&#xff0c;请记住将其标记为答案。如果否&#xff0c;请回复并告诉我们当前情况&#xff0c;以便提供进一步的帮助。Best regard,SylviaPlease remember to mark the replies as answers if they help. &qu…

MVC5+EF6 入门完整教程四

MVC5EF6 入门完整教程四 原文:MVC5EF6 入门完整教程四上篇文章主要讲了如何配置EF, 我们回顾下主要过程&#xff1a; 创建Data Model 创建Database Context 创建databaseInitializer配置entityFramework的context配置节。 对这个过程还有疑问的可以去上篇再看一下。 本次我…

android js调试

http://blog.allenm.me/ 其他平台去这篇文章看 1 //js调试调试功能支持4.4版本以上的2 if(Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {3 WebView.setWebContentsDebuggingEnabled(true);4 }5 //j…

python 比赛成绩预测_利用 Python 预测英雄联盟胜负,分析了 5 万多场比赛才得出的数据!值得,涨知识了!...

Mika 来源 | 头图 |CSDN自东方IC今天教大家用Python预测英雄联盟比赛胜负。Show me data&#xff0c;用数据说话今天我们聊一聊 Python预测LOL胜负目前&#xff0c;英雄联盟S10全球总决赛正在火热进行中&#xff0c;最终决赛于10月31日在浦东足球场举行。作为当下最火热的电竞赛…

服务器2003蓝屏A5修复,0x000000a5蓝屏完美解决方法 Win7

0x000000a5蓝屏怎么办&#xff1f;在Win7系统下遭遇开机时出现蓝屏代码0x000000a5非常多&#xff0c;由于根据代码我们并不能分析出故障原因&#xff0c;那么只能求助于网络上大家分享的经验了&#xff0c;下面小编给大家分享下0x000000a5蓝屏完美解决方法&#xff0c;适用于Wi…