spring-spring websockett 有哪些版本

Spring中配置WebSocket
项目中需要在浏览器中实时查看 Docker 容器内框架的运行日志,
在服务器上可以通过 docker 提供的 RESTful 接口, 获取 tail...
纠结了两天的
import org.springframework.context.annotation.B
import org.springframework.context.annotation.Co...
Spring中使用WebSocket
需要实现继承重写两个类,一个是类是TextWebSocketHandler,一个是HttpSessionHandshakeInterceptor,后面的那个是对前面的那个hander的连接方法的处理。...
spring框架中自带了websocket的jar包,利用它可以实现与H5中WebSocket的对接,甚至websocket还可以通过依赖注入与http请求一同工作,详细配置实现过程如下
文件目录结构...
一、测试环境
Tomcat8.0.18
二、新建一个SpringMVC的工程
使用Maven新建一个web工程,添加Spri...
spring4支持了websocket,但是关于如何将websocket session
和httpsession关联,没有找到好的方式,这里提供一个不太靠谱的办法,望指正...
Spring Session是Spring的项目之一,GitHub地址:https://github.com/spring-projects/spring-session。
Spring Sessio...
他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)Spring整合WebSocket应用示例(上)
作者:Bridge Li
字体:[ ] 类型:转载 时间:
以下教程是小编在参与开发公司的一个crm系统,整理些相关资料,在该系统中有很多消息推送功能,在其中用到了websocket技术。下面小编整理分享到脚本之家平台供大家参考
以下教程是小编在参与开发公司的一个crm系统,整理些相关资料,在该系统中有很多消息推送功能,在其中用到了websocket技术。下面小编整理分享到脚本之家平台供大家参考
1. maven依赖
&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. spring-servlet的配置
&?xml version="1.0" encoding="UTF-8"?&
&beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:tx="http://www.springframework.org/schema/tx" 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-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/websocket
http://www.springframework.org/schema/websocket/spring-websocket.xsd"&
&!-- websocket --&
&bean id="websocket" class="cn.bridgeli.websocket.WebsocketEndPoint"/&
&websocket:handlers&
&websocket:mapping path="/websocket" handler="websocket"/&
&websocket:handshake-interceptors&
&bean class="cn.bridgeli.websocket.HandshakeInterceptor"/&
&/websocket:handshake-interceptors&
&/websocket:handlers&
其中,path对应的路径就是前段通过ws协议调的接口路径
3. HandshakeInterceptor的实现
package cn.bridgeli.
import cn.bridgeli.utils.UserM
import cn.bridgeli.util.DateU
import cn.bridgeli.sharesession.UserI
import org.apache.commons.lang.StringU
import org.slf4j.L
import org.slf4j.LoggerF
import org.springframework.http.server.ServerHttpR
import org.springframework.http.server.ServerHttpR
import org.springframework.web.context.request.RequestContextH
import org.springframework.web.context.request.ServletRequestA
import org.springframework.web.socket.WebSocketH
import org.springframework.web.socket.server.support.HttpSessionHandshakeI
import java.util.D
import java.util.M
* @Description :创建握手(handshake)接口
* @Date : 16-3-3
public class HandshakeInterceptor extends HttpSessionHandshakeInterceptor{
private static final Logger logger = LoggerFactory.getLogger(HandshakeInterceptor.class);
public boolean beforeHandshake(ServerHttpRequest request,
ServerHttpResponse response, WebSocketHandler wsHandler,
Map&String, Object& attributes) throws Exception {
logger.info("建立握手前...");
ServletRequestAttributes attrs = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
UserInfo currUser = UserManager.getSessionUser(attrs.getRequest());
UserSocketVo userSocketVo = new UserSocketVo();
String email= "";
if(null != currUser){
email = currUser.getEmail();
if(StringUtils.isBlank(email)){
email = DateUtil.date2String(new Date());
userSocketVo.setUserEmail(email);
attributes.put("SESSION_USER", userSocketVo);
return super.beforeHandshake(request, response, wsHandler, attributes);
public void afterHandshake(ServerHttpRequest request,
ServerHttpResponse response, WebSocketHandler wsHandler,
Exception ex) {
logger.info("建立握手后...");
super.afterHandshake(request, response, wsHandler, ex);
因为老夫不是很懂,所以最大限度的保留原代码,这其实就是从单点登录中取出当前登录用户,转成UserSocketVo对象,放到Map中。所以接下来我们看看UserSocketVo对象的定义
4. UserSocketVo的定义
package cn.bridgeli.
import org.springframework.web.socket.WebSocketS
import java.util.D
* @Description : 用户socket连接实体
* @Date : 16-3-7
public class UserSocketVo {
private String userE //用户邮箱
private Date connectionT //成功连接时间
private Date preRequestT //上次请求时间
private Date newRequestT //新请求时间
private Date lastSendTime = new Date(); //下架消息最近一次发送时间
private Date lastTaskSendTime = new Date(); //待处理任务最近一次发送时间
private WebSocketSession webSocketS //用户对应的wsSession 默认仅缓存一个
// getXX and setXX
其中最重要的就是这个WebSocketSession这个属性了,后面我们要用到
5. WebsocketEndPoint的实现
package cn.bridgeli.
import org.slf4j.L
import org.slf4j.LoggerF
import org.springframework.beans.factory.annotation.A
import org.springframework.web.socket.CloseS
import org.springframework.web.socket.TextM
import org.springframework.web.socket.WebSocketS
import org.springframework.web.socket.handler.TextWebSocketH
* @Description : websocket处理类
* @Date : 16-3-3
public class WebsocketEndPoint extends TextWebSocketHandler{
private static final Logger logger = LoggerFactory.getLogger(WebsocketEndPoint.class);
@Autowired
private NewsListenerImpl newsL
protected void handleTextMessage(WebSocketSession session,
TextMessage message) throws Exception {
super.handleTextMessage(session, message);
TextMessage returnMessage = new TextMessage(message.getPayload()+" received at server");
session.sendMessage(returnMessage);
* @Description : 建立连接后
* @param session
* @throws Exception
public void afterConnectionEstablished(WebSocketSession session) throws Exception{
UserSocketVo userSocketVo = (UserSocketVo)session.getAttributes().get("SESSION_USER");
if(null != userSocketVo){
userSocketVo.setWebSocketSession(session);
if(WSSessionLocalCache.exists(userSocketVo.getUserEmail())){
WSSessionLocalCache.remove(userSocketVo.getUserEmail());
WSSessionLocalCache.put(userSocketVo.getUserEmail(), userSocketVo);
newsListener.afterConnectionEstablished(userSocketVo.getUserEmail());
logger.info("socket成功建立连接...");
super.afterConnectionEstablished(session);
public void afterConnectionClosed(WebSocketSession session,CloseStatus status) throws Exception{
UserSocketVo userSocketVo = (UserSocketVo)session.getAttributes().get("SESSION_USER");
if(null != userSocketVo){
WSSessionLocalCache.remove(userSocketVo.getUserEmail());
logger.info("socket成功关闭连接...");
super.afterConnectionClosed(session, status);
6. WSSessionLocalCache的实现
package cn.bridgeli.
import java.io.S
import java.util.ArrayL
import java.util.HashM
import java.util.L
import java.util.M
* @Description :本地缓存WebSocketSession实例
* @Date : 16-3-7
public class WSSessionLocalCache implements Serializable {
private static Map&String, UserSocketVo& wsSessionCache = new HashMap&&();
public static boolean exists(String userEmail){
if(!wsSessionCache.containsKey(userEmail)){
public static void put(String userEmail, UserSocketVo UserSocketVo){
wsSessionCache.put(userEmail, UserSocketVo);
public static UserSocketVo get(String userEmail){
return wsSessionCache.get(userEmail);
public static void remove(String userEmail){
wsSessionCache.remove(userEmail);
public static List&UserSocketVo& getAllSessions(){
return new ArrayList&&(wsSessionCache.values());
看了其实现,作用就比较明显了吧,存放每个UserSocketVo的最新数据,其实到这里我们websocket的实现已经算完了,但还有一个核心类(关于业务逻辑查理的类)没有实现,下篇Spring整合WebSocket应用示例(下),我们就看怎么实现这个类。
WebSocket协议介绍
WebSocket协议是RFC-6455规范定义的一个Web领域的重要的功能:全双工,即客户端和服务器之间的双向通信。它是一个令人兴奋的功能,业界在此领域上已经探索很久,使用的技术包括Java Applet、XMLHttpRequest、Adobe Flash、ActiveXObject、各种Comet技术、服务器端的发送事件等。
需要理解一点,在使用WebSocket协议前,需要先使用HTTP协议用于构建最初的握手。这依赖于一个机制——建立HTTP,请求协议升级(或叫协议转换)。当服务器同意后,它会响应HTTP状态码101,表示同意切换协议。假设通过TCP套接字成功握手,HTTP协议升级请求通过,那么客户端和服务器端都可以彼此互发消息。
Spring框架4.0以上版本引入了一个新模块,即spring-websocket模块。它对WebSocket通信提供了支持。它兼容Java WebSocket API规范JSR-356,同时提供了额外的功能。
什么场景下该使用WebSocket
在Web应用中,客户端和服务器端需要以较高频率和较低延迟来交换事件时,适合用WebSocket。因此WebSocket适合财经、游戏、协作等应用场景。
对于其他应用场景则未必适合。例如,某个新闻订阅需要显示突发新闻,使用间隔几分钟的长轮询也是可以的,这里的延迟可以接受。
即使在要求低延迟的应用场景,如果传输的消息数很低(比如监测网络故障的场景),那么应该考虑使用长轮询技术。
而只有在低延迟和高频消息通信的场景下,选用WebSocket协议才是非常适合的。即使是这样的应用场景,仍然存在是选择WebSocket通信呢?又或者是选择REST HTTP通信呢?
答案是会根据应用程序的需求而定。但是,也可能同时使用这两种技术,把需要频繁交换的数据放到WebSocket中实现,而把REST API作为过程性的业务的实现技术。另外,当REST API的调用中需要把某个信息广播给多个客户端是,也可以通过WebSocket连接来实现。
Spring框架提供了@Controller注释和@RestController注释,两者都可以用于HTTP请求的处理以及WebSocket消息的处理。另外,Spring MVC的请求处理方法,或其它应用程序的请求处理方法,都可以很容易地使用WebSocket协议来广播消息到所有感兴趣的客户端或指定用户。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具org.springframework/spring-websocket/4.0.5.RELEASE 依赖的jar包
ArtifactId
General data-binding functionality for Jackson: works on core streaming API
JSR 356: Java API for WebSocket
Tomcat WebSocket (JSR356) implementation
Jetty web application support
Spring Context
Spring Core
Spring Messaging
Spring Web
Spring Web MVC
org.springframework/spring-websocket/4.0.5.RELEASE没有被maven中央仓库的任何jar包依赖!
项目开发人员:
最近半年最热Maven Group
最近一年最热Maven Group博客分类:
websocket的通信形式今天刚学,好处就不说了,网上有很多,下面把写的即时通信的demo记录下来,运行出来像下面一样:
一、spring必须4.0以上,maven的pom文件如下:
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-orm&/artifactId&
&version&4.2.4.RELEASE&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-webmvc&/artifactId&
&version&4.2.4.RELEASE&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-websocket&/artifactId&
&version&4.2.4.RELEASE&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-messaging&/artifactId&
&version&4.2.4.RELEASE&/version&
&/dependency&
当然了,还有servlet等等了。。。那些就自己查了
二、spring中,关于websocket的配置:
&bean id="websocket" class="com.wang.test.websocket.demo.WebSocketHander" /&
&websocket:handlers&
&websocket:mapping path="/echo" handler="websocket" /&
&websocket:handshake-interceptors&
&bean class="com.wang.test.websocket.demo.HandshakeInterceptor" /&
&/websocket:handshake-interceptors&
&/websocket:handlers&
不要忘记引入xsd文件,
http://www.springframework.org/schema/websocket
http://www.springframework.org/schema/websocket/spring-websocket-4.0.xsd
整个关于websocket的配置文件如下:
&?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-4.0.xsd
http://www.springframework.org/schema/websocket
http://www.springframework.org/schema/websocket/spring-websocket-4.0.xsd"&
&bean id="websocket" class="com.wang.test.websocket.demo.WebSocketHander" /&
&websocket:handlers&
&websocket:mapping path="/echo" handler="websocket" /&
&websocket:handshake-interceptors&
&bean class="com.wang.test.websocket.demo.HandshakeInterceptor" /&
&/websocket:handshake-interceptors&
&/websocket:handlers&
三、Interceptor类
package com.wang.test.websocket.
import org.springframework.http.server.ServerHttpR
import org.springframework.http.server.ServerHttpR
import org.springframework.http.server.ServletServerHttpR
import org.springframework.web.socket.WebSocketH
import javax.servlet.http.HttpServletR
import java.util.M
public class HandshakeInterceptor implements org.springframework.web.socket.server.HandshakeInterceptor{
// 初次握手访问前
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse serverHttpResponse,
WebSocketHandler webSocketHandler, Map&String, Object& map) throws Exception {
if (request instanceof ServletServerHttpRequest) {
HttpServletRequest servletRequest = ((ServletServerHttpRequest) request).getServletRequest();
String userName = "xq";
// 使用userName区分WebSocketHandler,以便定向发送消息
// String userName = (String)
// session.getAttribute("WEBSOCKET_USERNAME");
map.put("WEBSOCKET_USERNAME", userName);
servletRequest.getSession().setAttribute("WEBSOCKET_USERNAME", userName);
// 初次握手访问后
public void afterHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse,
WebSocketHandler webSocketHandler, Exception e) {
四、WebSocketHander类
package com.wang.test.websocket.
import org.apache.log4j.L
import org.springframework.web.socket.*;
import java.io.IOE
import java.util.ArrayL
public class WebSocketHander implements WebSocketHandler {
private static final Logger logger = Logger.getLogger(WebSocketHander.class);
private static final ArrayList&WebSocketSession& users = new ArrayList&&();
// 初次链接成功执行
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
logger.debug("链接成功......");
users.add(session);
String userName = (String) session.getAttributes().get("WEBSOCKET_USERNAME");
if (userName != null) {
// 查询未读消息
int count = 5;
session.sendMessage(new TextMessage(count + ""));
// 接受消息处理消息
public void handleMessage(WebSocketSession webSocketSession, WebSocketMessage&?& webSocketMessage)
throws Exception {
sendMessageToUsers(new TextMessage(webSocketMessage.getPayload() + ""));
public void handleTransportError(WebSocketSession webSocketSession, Throwable throwable) throws Exception {
if (webSocketSession.isOpen()) {
webSocketSession.close();
logger.debug("链接出错,关闭链接......");
users.remove(webSocketSession);
public void afterConnectionClosed(WebSocketSession webSocketSession, CloseStatus closeStatus) throws Exception {
logger.debug("链接关闭......" + closeStatus.toString());
users.remove(webSocketSession);
public boolean supportsPartialMessages() {
* 给所有在线用户发送消息
* @param message
public void sendMessageToUsers(TextMessage message) {
for (WebSocketSession user : users) {
if (user.isOpen()) {
user.sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
* 给某个用户发送消息
* @param userName
* @param message
public void sendMessageToUser(String userName, TextMessage message) {
for (WebSocketSession user : users) {
if (user.getAttributes().get("WEBSOCKET_USERNAME").equals(userName)) {
if (user.isOpen()) {
user.sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
五、页面显示文件:
&%@ page language="java" import="java.util.*" pageEncoding="utf-8"%&
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
+ path + "/";
&!DOCTYPE HTML&
&meta charset="UTF-8"&
&script src="http://cdn.sockjs.org/sockjs-0.3.min.js"&&/script&
&!-- 新 Bootstrap 核心 CSS 文件 --&
&link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css"&
&!-- 可选的Bootstrap主题文件(一般不用引入) --&
&link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap-theme.min.css"&
&!-- jQuery文件。务必在bootstrap.min.js 之前引入 --&
&script src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"&&/script&
&!-- 最新的 Bootstrap 核心 JavaScript 文件 --&
&script src="//cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"&&/script&
&title&webSocket测试&/title&
&script type="text/javascript"&
$(function() {
if ('WebSocket' in window) {
alert("WebSocket");
var url = 'ws://' + window.location.host + '/SSMTest/echo';
websocket = new WebSocket(url);
//websocket = new WebSocket("ws://127.0.0.1:8080/SSMTest/echo");
} else if ('MozWebSocket' in window) {
alert("MozWebSocket");
websocket = new MozWebSocket("ws://echo");
alert("SockJS");
websocket = new SockJS("http://127.0.0.1:8080/SSMTest/sockjs/echo");
websocket.onopen = function(evnt) {
$("#tou").html("链接服务器成功!")
websocket.onmessage = function(evnt) {
$("#msg").html($("#msg").html() + "&br/&" + evnt.data);
websocket.onerror = function(evnt) {
websocket.onclose = function(evnt) {
$("#tou").html("与服务器断开了链接!")
$('#send').bind('click', function() {
function send() {
if (websocket != null) {
var message = document.getElementById('message').
websocket.send(message);
alert('未与服务器链接.');
&div class="page-header" id="tou"&webSocket及时聊天Demo程序&/div&
&div class="well" id="msg"&&/div&
&div class="col-lg"&
&div class="input-group"&
&input type="text" class="form-control" placeholder="发送信息..."
id="message"& &span class="input-group-btn"&
&button class="btn btn-default" type="button" id="send"&发送&/button&
&!-- /input-group --&
&!-- /.col-lg-6 --&
&!-- /.row --&
六、参考:
把这里面配置形式改了
七、代码地址:
莫欺少年穷Java
浏览: 113313 次
来自: 沈阳
在JDK 8中,Javadoc中添加了doclint,而这个工 ...
我也遇到这个问题了,不知道怎么解决。。。
你自己验证过吗?可以运行出结果吗?
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'}

我要回帖

更多关于 spring整合websocket 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信