学习WebSocket(一):Spring WebSocket的简单使用
1、什么是websocket?
WebSocket协议定义了一种web应用的新功能,它实现了服务器端和客户端的全双工通信。全双工通信即通信的双方可以同时发送和接收信息 的信息交互方式。它是继Java applets, XMLHttpRequest, Adobe Flash, ActiveXObject等使web应用更具交互性的新技术。
在实现连线过程中,浏览器和服务器通过TCP三次握手建立连接。 如果和服务器连接成功后,浏览器通过HTTP发送握手请求,如果服务器同意握手连接,客户端和服务端之后就能互相之间发送信息。HTTP只用于开始的握手,一旦成功建立握手连接,HTTP不会参与数据传输,使用TCP连接来传输数据。

2、以往和服务器交互的几种方式
轮询
长轮询就是客户端按照一个固定的时间定期向服务器发送请求,通常这个时间间隔的长度受到服务端的更新频率和客户端处理更新数据时间的影响。这种方式缺点很明显,就是浏览器要不断发请求到服务器以获取最新信息,造成服务器压力过大,占用宽带资源。
使用streaming AJAX
streaming ajax是一种通过ajax实现的长连接维持机制。主要目的就是在数据传输过程中对返回的数据进行读取,并且不会关闭连接。
iframe方式
iframe可以在页面中嵌套一个子页面,通过将iframe的src指向一个长连接的请求地址,服务端就能不断往客户端传输数据。
3、什么时候用websocket?
最适合websocket的web应用的就是那些客户端和服务器端需要高频繁、低延迟交换信息的应用。
4、如何使用websocket?
Spring提供了一个是适应于各种websocket引擎的websocket api,例如是Tomcat (7.0.47+)和GlassFish (4.0+),也适应于支持原生websocket的Jetty (9.0+)。而不同的浏览器对websocket的支持程度也有所不同,如果浏览器websocket不支持,那么可以用SocketJs代替websocket。
创建和配置WebSocketHandler
WebSocketHandler用于处理websocket的消息。
public class MyHandler extends TextWebSocketHandler {
@Override
public void handleTextMessage(WebSocketSession session, TextMessage message) {
session.sendMessage(message);
}
}
创建和配置HandshakeInterceptor
HandshakeInterceptor用于处理握手前后的预处理工作。
public class HandshakeInterceptor extends HttpSessionHandshakeInterceptor {
@Override
public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception ex) {
System.out.println("After Handshake");
super.afterHandshake(request, response, wsHandler, ex);
}
@Override
public 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);
}
}
同时配置spring-websocket.xml
<?xml version="1.0" encoding="UTF-8"?>
<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.xsd
http://www.springframework.org/schema/websocket
http://www.springframework.org/schema/websocket/spring-websocket.xsd"> <websocket:handlers>
<websocket:mapping handler="myHandler" path="/myHandler"/>
<websocket:handshake-interceptors>
<bean class="org.springframework.samples.HandshakeInterceptor"></bean>
</websocket:handshake-interceptors>
</websocket:handlers>
<!--兼容低版本浏览器-->
<websocket:handlers>
<websocket:mapping handler="myHandler" path="/js/myHandler"/>
<websocket:handshake-interceptors>
<bean class="org.springframework.samples.HandshakeInterceptor"></bean>
</websocket:handshake-interceptors>
<websocket:sockjs />
</websocket:handlers> <bean id="myHandler" class="org.springframework.samples.MyHandler"></bean> </beans>
在页面上添加JavaScript
<script type="text/javascript" src="js/sockjs.min.js"></script>
<script type="text/javascript">
//websocket-demo是project name
var sock=null;
if (window['WebSocket']) {
sock= new WebSocket('ws://' + window.location.host+'/websocket-demo/myHandler');
}
else
sock= new SockJS('/websocket-demo/js/myHandler');//兼容低版本浏览器
sock.onopen = function() {
console.log('Opening');
sayHello();
};
sock.onmessage = function(e) {
alert('Received message: '+ e.data);
};
sock.onclose = function() {
console.log('Closing');
};
function sayHello() {
console.log('Sending Hello!');
sock.send("Hello!");
}
</script>
如果要兼容低版本浏览器,还要在web.xml添加
<async-supported>true</async-supported>
需要注意的地方:
1、应用服务器的版本,如果版本过低是不支持websocket的
2、JavaScript的websocket的url应该和spring-websocket.xml的<websocket:mapping path="">一致
3、要兼容低版本浏览器,要使用web3.0,还有必须在一个请求涉及的所有Servlet及Filter中都声明asyncSupported=true。
学习WebSocket(一):Spring WebSocket的简单使用的更多相关文章
- 谈一谈Tomcat中webSocket,Jetty WebSocket 和Spring WebSocket以及github中Java-WebSocket.jar分别对Socket协议的角色定位以及效果的不同点;
开局先上一张图:(http://tomcat.apache.org/tomcat-7.0-doc/web-socket-howto.html) 当前截图来自于apache的tomcat官网(问:为 ...
- Spring 学习——基于Spring WebSocket 和STOMP实现简单的聊天功能
本篇主要讲解如何使用Spring websocket 和STOMP搭建一个简单的聊天功能项目,里面使用到的技术,如websocket和STOMP等会简单介绍,不会太深,如果对相关介绍不是很了解的,请自 ...
- spring websocket集群问题的简单记录
目录 前言 解决方案 代码示例 前言 最近公司里遇到一个问题,在集群中一些websocket的消息丢失了. 产生问题的原理很简单,发送消息的服务和接收者连接的服务不是同一个服务. 解决方案 用中间件( ...
- WebSocket 学习教程(二):Spring websocket实现消息推送
=============================================== 环境介绍: Jdk 1.7 (1.6不支持) Tomcat7.0.52 (支持Websocket协议) ...
- spring WebSocket详解
场景 websocket是Html5新增加特性之一,目的是浏览器与服务端建立全双工的通信方式,解决http请求-响应带来过多的资源消耗,同时对特殊场景应用提供了全新的实现方式,比如聊天.股票交易.游戏 ...
- spring websocket源码分析
什么是websocket? 摘录于wiki[1]: WebSocket is a protocol providing full-duplex communication channels over ...
- Spring WebSocket初探2 (Spring WebSocket入门教程)<转>
See more: Spring WebSocket reference整个例子属于WiseMenuFrameWork的一部分,可以将整个项目Clone下来,如果朋友们有需求,我可以整理一个独立的de ...
- Spring WebSocket初探1 (Spring WebSocket入门教程)<转>
See more: Spring WebSocket reference整个例子属于WiseMenuFrameWork的一部分,可以将整个项目Clone下来,如果朋友们有需求,我可以整理一个独立的de ...
- Spring WebSocket教程(二)
实现目标 这一篇文章,就要直接实现聊天的功能,并且,在聊天功能的基础上,再实现缓存一定聊天记录的功能. 第一步:聊天实现原理 首先,需要明确我们的需求.通常,网页上的聊天,都是聊天室的形式,所以,这个 ...
随机推荐
- webapp开发需要注意的浏览器内核知识
Web App:1.开发成本较低使用web开发技术就可以轻松的完成web app的开发2.升级较简单升级不需要通知用户,在服务端更新文件即可,用户完全没有感觉3.维护比较轻松和一般的web一样,维护比 ...
- React 学习笔记(一)
React + es6 一.createClass 与 component 的区别 The API (via 'extends React.Component') is similar to Reac ...
- StringBuffer and StringBuilder
As of release JDK 5, this class has been supplemented with an equivalent class designed for use by a ...
- AlwaysOn--Backup Preference
AlwaysOn group的一个新特性是允许在secondary replica进行backup,将backup的负载从primary replica上移除去. 并且提供了Backup prefer ...
- linux:nohup 不生成 nohup.out的方法
nohup java -jar /xxx/xxx/xxx.jar >/dev/null 2>&1 & 关键在于最后的 >/dev/null 2>&1 部 ...
- 纯手工搭建JSF开发环境(JSF2.2+maven+weblogic 12c/jboss EAP 6.1+)
前言: JSF 2.X因为种种原因(我个人觉得主要是因为推出太晚),再加上EJB2之前的设计过于复杂,引起很多开发人员对官方解决方案的反感,即使EJB3后来做了大量改进,国内也很少有人对EJB3感兴趣 ...
- es6+移动轮播插件
前言:之前赶项目,都是直接用框架,对于touch事件是模拟两可,趁着有心情,用es6写一个原生移动轮播插件. 用了es6的新特性,确实挺爽的,说到es6,就不得不说到babel,博主已经码好了,直接用 ...
- Webwork 学习之路【04】Configuration 详解
Webwork做为经典的Web MVC 框架,个人觉得源码中配置文件这部分代码的实现十分考究. 支持自定义自己的配置文件.自定义配置文件读取类.自定义国际化支持. 可以作为参考,单独引入到其他项目中, ...
- C/C++实践笔记_001Helloworld
1.void返回值为空,int返回值Linux c,c++中,Main函数可以返回也可以不返回,普通函数必须返回.C编译松散,很容易结果出错,C++编译严格一些,结果一般会正确C语言不返回不会报错,但 ...
- ASP.NET MVC 多语言实现技巧 最简、最易维护和最快速开发
说说传统做法的缺点 1.做过多语言的都知道这玩意儿太花时间 2.多语言架构一般使用资源文件.XML或者存储数据库来实现.这样就在一定程序上降低了性能 3.页面的可读性变差,需要和资源文件进行来回切换 ...