一、项目说明

1、项目地址:https://github.com/hqzmss/test01-springboot-websocket.git

2、IDE:IntelliJ IDEA 2018.1.1 x64

二、步骤说明

Spring Boot实现WebSocket比较简单,主要分以下四步:

1、添加依赖

 <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

其他的依赖只涉及到Spring Boot本身的依赖

2、创建拦截器

拦截器要实现【HandshakeInterceptor】这个接口,并实现它的两个方法。

拦截器的主要作用是在WebSocket创建握手之前和之后进行一些相应的处理

 package com.hqzmss.websocket_demo1;

 import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.HandshakeInterceptor; import java.util.Map; /**
* 拦截器
*/
public class MyWebSocketInterceptor implements HandshakeInterceptor { /**
* 握手之前调用
* @param serverHttpRequest 当前请求
* @param serverHttpResponse 当前响应
* @param webSocketHandler 目标处理器
* @param map 请求属性
* @return 是否通过
* @throws Exception 异常信息
*/
@Override
public boolean beforeHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Map<String, Object> map) throws Exception {
System.out.println("连接前进行处理");
return true;
} /**
* 握手之后调用
* @param serverHttpRequest 当前请求
* @param serverHttpResponse 当前响应
* @param webSocketHandler 目标处理器
* @param e 握手期间引发的异常,如果没有,则为null
*/
@Override
public void afterHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Exception e) {
System.out.println("连接后进行处理");
}
}

3、创建处理器

处理器是所有消息的处理中心。

【afterConnectionEstablished】:这个方法会为每个WebSocket连接创建一个WebSocketSession,标识一个连接。

              可以将这个WebSocketSession保存起来,以后要是服务器有消息要发送到这个客户端,则通过WebSocketSession直接发送

【handleMessage】:从客户端发来的消息由此方法接收并做相应处理。消息由WebSocketMessage来接收。

 package com.hqzmss.websocket_demo1;

 import org.springframework.web.socket.*;

 /**
* 创建处理器
*/
public class MyHandler implements WebSocketHandler {
/**
* 在WebSocket协商成功后调用,并且打开WebSocket连接准备使用
* @param webSocketSession webSocketSession
* @throws Exception 异常
*/
@Override
public void afterConnectionEstablished(WebSocketSession webSocketSession) throws Exception {
System.out.println("sessionId=" + webSocketSession.getId());
} /**
* 当一个新的WebSocket消息到达时调用
* @param webSocketSession webSocketSession
* @param webSocketMessage webSocketMessage
* @throws Exception 异常
*/
@Override
public void handleMessage(WebSocketSession webSocketSession, WebSocketMessage<?> webSocketMessage) throws Exception {
System.out.println(webSocketMessage.getPayload());
System.out.println("有消息到达服务器!");
} /**
* 处理来自底层WebSocket消息传输的错误
* @param webSocketSession webSocketSession
* @param throwable 错误
* @throws Exception 异常
*/
@Override
public void handleTransportError(WebSocketSession webSocketSession, Throwable throwable) throws Exception { } /**
* 在网络套接字连接关闭后或在传输错误发生后调用。
* 尽管从技术上讲,会话可能仍然是开放的,但取决于底层实现,在这一点上发送消息是不鼓励的,而且很可能不会成功。
* @param webSocketSession webSocketSession
* @param closeStatus closeStatus
* @throws Exception 异常
*/
@Override
public void afterConnectionClosed(WebSocketSession webSocketSession, CloseStatus closeStatus) throws Exception {
if(webSocketSession.isOpen()) {
webSocketSession.close();
}
System.out.println("安全退出了系统");
} /**
* WebSocketHandler是否处理部分消息
* @return 标志
*/
@Override
public boolean supportsPartialMessages() {
return false;
}
}

4、添加配置项目

1)、要记得添加@EnableWebSocket注解,标识这个配置是WebSocket配置

2)、"/webSocketServer.action"是自定义的连接点,客户端要通过WebSocket连接此服务器则是通过此连接点

3)、.setAllowedOrigins("*"),这个方法要加上,不加的话有可能连接会被拦截掉

 package com.hqzmss.websocket_demo1;

 import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.config.annotation.*; @Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer { @Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry webSocketHandlerRegistry) {
webSocketHandlerRegistry.addHandler(webSocketHandler(), "/webSocketServer.action").addInterceptors(new MyWebSocketInterceptor()).setAllowedOrigins("*");
webSocketHandlerRegistry.addHandler(webSocketHandler(), "/sockjs/webSocketServer.action")
.addInterceptors(new MyWebSocketInterceptor()).withSockJS();
} @Bean
public WebSocketHandler webSocketHandler() {
return new MyHandler();
}
}

Spring Boot之WebSocket的更多相关文章

  1. 【websocket】spring boot 集成 websocket 的四种方式

    集成 websocket 的四种方案 1. 原生注解 pom.xml <dependency> <groupId>org.springframework.boot</gr ...

  2. spring boot 集成 websocket 实现消息主动推送

    spring boot 集成 websocket 实现消息主动 前言 http协议是无状态协议,每次请求都不知道前面发生了什么,而且只可以由浏览器端请求服务器端,而不能由服务器去主动通知浏览器端,是单 ...

  3. Spring Boot 集成 WebSocket 实现服务端推送消息到客户端

    假设有这样一个场景:服务端的资源经常在更新,客户端需要尽量及时地了解到这些更新发生后展示给用户,如果是 HTTP 1.1,通常会开启 ajax 请求询问服务端是否有更新,通过定时器反复轮询服务端响应的 ...

  4. spring boot整合websocket

    转载自:https://www.cnblogs.com/GoodHelper/p/7078381.html 一.WebSocket简单介绍 随着互联网的发展,传统的HTTP协议已经很难满足Web应用日 ...

  5. Spring Boot 系列 - WebSocket 简单使用

    在实现消息推送的项目中往往需要WebSocket,以下简单讲解在Spring boot 中使用 WebSocket. 1.pom.xml 中引入 spring-boot-starter-websock ...

  6. spring boot 使用WebSocket与前端进行byte字节数组交互

    一.装逼前先热热身 无论是比较传统的 web项目 还是近几年流行的前后端分离,后端只独立提供数据交互接口服务的项目,都避免不了数据之间交互格式的选择. 从很早之前的 xml 格式 到现在最火热的jso ...

  7. spring boot整合websocket之使用自带tomcat启动项目报错记录

    项目中用到websocket,就将原来写好的websocket工具类直接拿来使用,发现前端建立连接的时候报404,经查找发现是因为原来用的是配置的外部tomcat启动,这次是spring boot自带 ...

  8. spring boot集成Websocket

    websocket实现后台像前端主动推送消息的模式,可以减去前端的请求获取数据的模式.而后台主动推送消息一般都是要求消息回馈比较及时,同时减少前端ajax轮询请求,减少资源开销. spring boo ...

  9. spring boot下WebSocket消息推送

    WebSocket协议 WebSocket是一种在单个TCP连接上进行全双工通讯的协议.WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范.WebSo ...

随机推荐

  1. Nginx日志配置及配置调试

    防火墙内的内网服务器,因为网关传过来的remot_addr都一样,不得不对Nginx的日志格式做了配置 配置语法如下: log_format  myformat  '$http_x_forwarded ...

  2. Ubuntu16.04下安装Hive

    上一篇博客我们已经说过了要如何安装Hadoop,别忘记了我们的目的是安装Hive.所以这篇博客,我就来介绍一下如何安装Hive. 一.环境准备 (1)Vmware (2)  Ubuntu 16.04 ...

  3. Django rest framework(6)----序列化

    目录 Django rest framework(1)----认证 Django rest framework(2)----权限 Django rest framework(3)----节流 Djan ...

  4. 条件随机场CRF(二) 前向后向算法评估标记序列概率

    条件随机场CRF(一)从随机场到线性链条件随机场 条件随机场CRF(二) 前向后向算法评估标记序列概率 条件随机场CRF(三) 模型学习与维特比算法解码 在条件随机场CRF(一)中我们总结了CRF的模 ...

  5. Robot framework(RF) Builti,Screenshot和Collections标准库介绍

    1.1  Builti标准类库 在学习一门编程语言的时候,大多教材都是从打印“hello world”开始.我们可以像编程语言一样来学习Robot Framework.虽然通过RIDE 提供“填表”一 ...

  6. GPU渲染流水线的简单概括

    GPU流水线 主要分为两个阶段:几何阶段和光栅化阶段   几何阶段      顶点着色器 --> 曲面细分着色器(可选)----->几何着色器(可选)----->裁剪-->屏幕 ...

  7. hibernate多表查询封装实体

    以前用sql实现联合查询 是非常简单的事,只需要写sql语句就可以,第一次遇到hibernate要实现多表联合查询的时候还楞了一下.最后看了下资料,才恍然大悟,hibernate实现多表联合查询跟SQ ...

  8. PAT1064: Compelte Binary Search Tree

    1064. Complete Binary Search Tree (30) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHE ...

  9. linux 用户空间与内核空间——高端内存详解

    摘要:Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对 ...

  10. Spring加载xml配置文件的方式 ApplicationContext

    大家都知道Java读普通文件是通过Basic I/O 中的InputStream.OutStream.Reader.Writer 等实现的.在spring 框架中,它是怎样识别xml这个配置文件的呢? ...