WebSocket是为解决客户端与服务端实时通信而产生的技术。其本质是先通过HTTP/HTTPS协议进行握手后创建一个用于交换数据的TCP连接,此后服务端与客户端通过此TCP连接进行实时通信。

以前我们实现推送技术,用的都是轮询,在特点的时间间隔有浏览器自动发出请求,将服务器的消息主动的拉回来,在这种情况下,我们需要不断的向服务器 发送请求,然而HTTP request 的header是非常长的,里面包含的数据可能只是一个很小的值,这样会占用很多的带宽和服务器资源。会占用大量的带宽和服务器资源。

WebSocket 最伟大之处在于服务器和客户端可以在给定的时间范围内的任意时刻,相互推送信息。在建立连接之后,服务器可以主动传送数据给客户端。此外,服务器与客户端之间交换的标头信息很小。

WebSocket并不限于以Ajax(或XHR)方式通信,因为Ajax技术需要客户端发起请求,而WebSocket服务器和客户端可以彼此相互推送信息。

如何使用?

注意:spring4.0以后加入了对websocket技术的支持,base项目的spring版本为3.1.4,升到4.0.2后加入spring自带的websocket包。

1、maven pom.xml加入websocket所依赖的jar包

  1. <!-- websocket -->
  2. <dependency>
  3. <groupId>com.fasterxml.jackson.core</groupId>
  4. <artifactId>jackson-annotations</artifactId>
  5. <version>2.3.0</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>com.fasterxml.jackson.core</groupId>
  9. <artifactId>jackson-core</artifactId>
  10. <version>2.3.1</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>com.fasterxml.jackson.core</groupId>
  14. <artifactId>jackson-databind</artifactId>
  15. <version>2.3.3</version>
  16. </dependency>
  17. <dependency>
  18. <groupId>org.springframework</groupId>
  19. <artifactId>spring-websocket</artifactId>
  20. <version>4.0.1.RELEASE</version>
  21. </dependency>
  22. <dependency>
  23. <groupId>org.springframework</groupId>
  24. <artifactId>spring-messaging</artifactId>
  25. <version>4.0.1.RELEASE</version>
  26. </dependency>

2、在servlet-context中添加

  1. http://www.springframework.org/schema/websocket http://www.springframework.org/schema/websocket/spring-websocket.xsd

3、创建websocket的处理类

  1. handleTextMessage 

  1. 消息处理方法,接收会话中前端发送给后台的message,再通过sendMessage发送到前端

  1. afterConnectionEstablished 连接建立后处理方法

  1. afterConnectionClosed 连接关闭后处理方法

  1. package cn.com.bmsoft.base.websocket;
  2. import java.io.IOException;
  3. import java.util.HashMap;
  4. import java.util.Map;
  5. import java.util.TimerTask;
  6. import java.util.concurrent.Executors;
  7. import java.util.concurrent.ScheduledExecutorService;
  8. import java.util.concurrent.TimeUnit;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.web.bind.annotation.RequestMapping;
  11. import org.springframework.web.socket.CloseStatus;
  12. import org.springframework.web.socket.TextMessage;
  13. import org.springframework.web.socket.WebSocketSession;
  14. import org.springframework.web.socket.handler.TextWebSocketHandler;
  15. import cn.com.bmsoft.base.service.face.management.IGasService;
  16. import cn.com.bmsoft.base.service.face.management.IHomeMonitorService;
  17. import cn.com.bmsoft.base.service.face.management.IInfraredService;
  18. @RequestMapping("websocket")
  19. public class WebsocketEndPoint extends TextWebSocketHandler {
  20. @Autowired
  21. IHomeMonitorService homeMonitorService;
  22. @Autowired
  23. IGasService gasService;
  24. @Autowired
  25. IInfraredService infraredService;
  26. @Override
  27. protected void handleTextMessage(WebSocketSession session,
  28. TextMessage message) throws Exception {
  29. super.handleTextMessage(session, message);
  30. String phonemessage = message.getPayload();
  31. session.sendMessage(message);
  32. }
  33. @Override
  34. public void afterConnectionEstablished(final WebSocketSession session) throws Exception {
  35. ScheduledExecutorService newScheduledThreadPool = Executors.newScheduledThreadPool(1);
  36. System.out.println("Connection Establied!");
  37. newScheduledThreadPool.scheduleWithFixedDelay(new TimerTask() {
  38. public void run() {
  39. try {
  40. Map<String, Object> queryParams = new HashMap<String, Object>();
  41. queryParams.put("gStatus","1");
  42. queryParams.put("iStatus","1");
  43. //查询未通知异常条数
  44. int gwarns = gasService.count(queryParams);
  45. int iwarns = infraredService.count(queryParams);
  46. if((gwarns+iwarns)!=0){
  47. session.sendMessage(new TextMessage((gwarns+iwarns)+""));
  48. }else{
  49. session.sendMessage(new TextMessage(0+""));
  50. }
  51. } catch (IOException e) {
  52. // TODO Auto-generated catch block
  53. e.printStackTrace();
  54. }
  55. }
  56. }, 0, 5000, TimeUnit.MILLISECONDS);
  57. }
  58. @Override
  59. public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
  60. System.out.println("Connection Closed!");
  61. }
  62. }

4、创建握手协议

  1. package cn.com.bmsoft.base.websocket;
  2. import org.springframework.http.server.ServerHttpRequest;
  3. import org.springframework.http.server.ServerHttpResponse;
  4. import org.springframework.web.socket.WebSocketHandler;
  5. import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;
  6. import java.util.Map;
  7. public class HandshakeInterceptor extends HttpSessionHandshakeInterceptor {
  8. @Override
  9. public boolean beforeHandshake(ServerHttpRequest request,
  10. ServerHttpResponse response, WebSocketHandler wsHandler,
  11. Map<String, Object> attributes) throws Exception {
  12. return super.beforeHandshake(request, response, wsHandler, attributes);
  13. }
  14. @Override
  15. public void afterHandshake(ServerHttpRequest request,
  16. ServerHttpResponse response, WebSocketHandler wsHandler,
  17. Exception ex) {
  18. super.afterHandshake(request, response, wsHandler, ex);
  19. }
  20. }

5、servletcontext配置处理类和握手协议

  1. <!-- spring-websocket配置start-->
  2. <bean id="websocket" class="cn.com.bmsoft.base.websocket.WebsocketEndPoint" />
  3. <websocket:handlers>
  4. <websocket:mapping path="/websocket" handler="websocket" />
  5. <websocket:handshake-interceptors>
  6. <bean class="cn.com.bmsoft.base.websocket.HandshakeInterceptor" />
  7. </websocket:handshake-interceptors>
  8. </websocket:handlers>
  9. <!-- spring-websocket配置end-->

6、客户端页面

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>websocket example</title>
  5. <meta charset="UTF-8">
  6. <meta http-equiv="X-UA-Compatible" content="IE=8,9,10" />
  7. <style type="text/css">
  8. #connect-container {
  9. float: left;
  10. width: 400px
  11. }
  12. #connect-container div {
  13. padding: 5px;
  14. }
  15. #console-container {
  16. float: left;
  17. margin-left: 15px;
  18. width: 400px;
  19. }
  20. #console {
  21. border: 1px solid #CCCCCC;
  22. border-right-color: #999999;
  23. border-bottom-color: #999999;
  24. height: 170px;
  25. overflow-y: scroll;
  26. padding: 5px;
  27. width: 100%;
  28. }
  29. #console p {
  30. padding: 0;
  31. margin: 0;
  32. }
  33. </style>
  34. <!-- <script src="http://cdn.sockjs.org/sockjs-0.3.min.js"></script> -->
  35. <script type="text/javascript" src="${requestContext.contextPath}/resources/scripts/sockjs-0.3.min.js"></script>
  36. <script type="text/javascript">
  37. var ws = null;
  38. var url = null;
  39. var transports = [];
  40. function setConnected(connected) {
  41. document.getElementById('connect').disabled = connected;
  42. document.getElementById('disconnect').disabled = !connected;
  43. document.getElementById('echo').disabled = !connected;
  44. }
  45. function connect() {
  46. alert("url:"+url);
  47. if (!url) {
  48. alert('Select whether to use W3C WebSocket or SockJS');
  49. return;
  50. }
  51. ws = new WebSocket(url); //申请一个WebSocket对象
  52. ws.onopen = function () {
  53. setConnected(true);
  54. log('Info: connection opened.');
  55. };
  56. ws.onmessage = function (event) {
  57. //var msgJson=eval("("+event.data+")");
  58. log('Received: ' +event.data);
  59. };
  60. ws.onclose = function (event) {
  61. setConnected(false);
  62. log('Info: connection closed.');
  63. log(event);
  64. };
  65. }
  66. function disconnect() {
  67. if (ws != null) {
  68. ws.close();
  69. ws = null;
  70. }
  71. setConnected(false);
  72. }
  73. function echo() {
  74. if (ws != null) {
  75. var message = document.getElementById('message').value;
  76. log('Sent: ' + message);
  77. var msg = '"frdId":"'+28+'",'
  78. + '"content":"'
  79. + message + '"';
  80. ws.send(msg);
  81. // ws.send(message);
  82. } else {
  83. alert('connection not established, please connect.');
  84. }
  85. }
  86. function updateUrl(urlPath) {
  87. if (window.location.protocol == 'http:') {
  88. url = 'ws://' + window.location.host + urlPath;
  89. } else {
  90. url = 'wss://' + window.location.host + urlPath;
  91. }
  92. }
  93. function log(message) {
  94. var console = document.getElementById('console');
  95. var p = document.createElement('p');
  96. p.style.wordWrap = 'break-word';
  97. p.appendChild(document.createTextNode(message));
  98. console.appendChild(p);
  99. while (console.childNodes.length > 25) {
  100. console.removeChild(console.firstChild);
  101. }
  102. console.scrollTop = console.scrollHeight;
  103. }
  104. </script>
  105. </head>
  106. <script type="text/javascript" src="${requestContext.contextPath}/resources/scripts/jquery-${jqueryVersion}.min.js"></script>
  107. <script type="text/javascript">
  108. $(function(){
  109. //移除顶端遮罩
  110. if (top.hideMask) top.hideMask();
  111. });
  112. </script>
  113. <body>
  114. <div>
  115. <div id="connect-container">
  116. <input id="radio1" type="radio" name="group1" onclick="updateUrl('/base/websocket');">
  117. <label for="radio1">W3C WebSocket</label>
  118. <div>
  119. <button id="connect" onclick="connect();">Connect</button>
  120. <button id="disconnect" disabled="disabled" onclick="disconnect();">Disconnect</button>
  121. </div>
  122. <div>
  123. <textarea id="message" style="width: 350px">Here is a message!</textarea>
  124. </div>
  125. <div>
  126. <button id="echo" onclick="echo();" disabled="disabled">Echo message</button>
  127. </div>
  128. </div>
  129. <div id="console-container">
  130. <div id="console"></div>
  131. </div>
  132. </div>
  133. </body>
  134. </html>

  1. sockjs-0.3.min.js

链接:http://pan.baidu.com/s/1c2uLpDY 密码:5zxh

Springmvc+WebSocket整合的更多相关文章

  1. spring+websocket整合

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

  2. Spring+springmvc+Mybatis整合案例 annotation版(myeclipse)详细版

    Spring+springmvc+Mybatis整合案例 Version:annotation版 文档结构图: 从底层开始做起: 01.配置web.xml文件 <?xml version=&qu ...

  3. Spring+springmvc+Mybatis整合案例 xml配置版(myeclipse)详细版

    Spring+springmvc+Mybatis整合案例 Version:xml版(myeclipse) 文档结构图: 从底层开始做起: 01.配置web.xml文件 <?xml version ...

  4. SpringMVC+redis整合

    在网络上有一个很多人转载的springmvc+redis整合的案例,不过一直不完整,也是被各种人装来转去,现在基本将该框架搭建起来. package com.pudp.bae.base; import ...

  5. sonne_game网站开发03 spring-mvc+freemarker整合

    今天的任务就是在spring+mybatis+springmvc的基础上,将freemarker整合进来. freemarker是什么? freemarker是一种模板引擎.它的目的是基于模板和数据, ...

  6. SpringMVC 中整合之JSON、XML

    每次看到好的博客我就想好好的整理起来,便于后面自己复习,同时也共享给网络上的伙伴们! 博客地址: springMVC整合Jaxb2.xStream:  http://www.cnblogs.com/h ...

  7. 框架篇:Spring+SpringMVC+hibernate整合开发

    前言: 最近闲的蛋疼,搭个框架写成博客记录下来,拉通一下之前所学知识,顺带装一下逼. 话不多说,我们直接步入正题. 准备工作: 1/ IntelliJIDEA的安装配置:jdk/tomcat等..(本 ...

  8. IDEA下使用maven构建web项目(SpringMVC+Mybatis整合)

    需求背景:由于最近总是接到一些需求,需要配合前端团队快速建设移动端UI应用或web应用及后台业务逻辑支撑的需求,若每次都复用之前复杂业务应用的项目代码,总会携带很多暂时不会用到的功能或组件,这样的初始 ...

  9. 框架篇:Spring+SpringMVC+Mybatis整合开发

    前言: 前面我已搭建过ssh框架(http://www.cnblogs.com/xrog/p/6359706.html),然而mybatis表示不服啊. Mybatis:"我抗议!" ...

随机推荐

  1. InnoDB存储引擎介绍-(1)InnoDB存储引擎结构

    首先以一张图简单展示 InnoDB 的存储引擎的体系架构. 从图中可见, InnoDB 存储引擎有多个内存块,这些内存块组成了一个大的内存池,主要负责如下工作: 维护所有进程/线程需要访问的多个内部数 ...

  2. Hadoop--单点故障修复

    nameNode单点故障修复 1.启动虚拟机,启动集群  此时我们将主机hadoop1关机(断掉主机),开始抢救: 1.使用 秘书(secondaryNameNode),成功率不是100%  (这里我 ...

  3. Hadoop---HDFS读写流程

    Hadoop---HDFS HDFS 性能详解 HDFS 天生是为大规模数据存储与计算服务的,而对大规模数据的处理目前还有没比较稳妥的解决方案. HDFS 将将要存储的大文件进行分割,分割到既定的存储 ...

  4. android project

  5. id: cannot find name for user ID xxx处理办法

    一.现像 root用户登录显示正常但以普通用户登录时报类似如下错误: id: cannot find name for user ID 500id: cannot find name for grou ...

  6. Linux升级内核教程(CentOS7)

    1.查看当前内核版本 uname -r 2.通过yum升级内核 通过yum升级内核是最保险的升级方式,因为安装的是操作系统发行厂商验证过兼容性的rpm包,升级风险一般很小. yum install - ...

  7. Java反序列化修复方案

    1)下载与当前大版本相同的commons-collections包(原来是3.2.x就替换为3.2.2,原来是4.x就替换为4.4.1) 下载链接:http://commons.apache.org/ ...

  8. e2e 测试(1)

    距离上一随笔,已经有一个月没有没写.到今天,刚刚好好,是学习e2e测试的一个月.今天有点时间可以总结一下这个月来的收获. 1.搭建e2e的测试环境 我是使用 Vue 构建项目,所以我也是通过Vue-c ...

  9. qt资源加载出错

    -1: error: No rule to make target '../InteractivePlayer/style.qss', needed by 'debug/qrc_res.cpp'.  ...

  10. Unity中Button按钮的触发监听事件

    第一种方式:需要把自己添加的Button按钮属性(Inspector)中的(Button)onclick添加方法. public void BtnCreteClick() { Debug.Log(&q ...