本文描述在spring boot下如何使用Websocket得两种方式,并以此文纪念我逝去的二抱和三抱

方式1:spring对javax的完全封装,可适用于复杂场景,例如IM即时通讯系统

方式2:javax注解+spring注解,场景适用于智能机器人客服,用户给服务器机器人发消息,服务器直接回复消息,配置上相对方式1来说简单一些

我个人觉得方式1更全面,所以我先阐述方式1

为了方便测试,首先我们自己建立一个HTML页面,超级简单,你可以新建一个文本文档,将后缀改成.html,然后直接复制下面我写好的代码,用浏览器打开即可,请注意我的端口是8081,请改成你需要的

<html>
怀念二抱三抱
<script>
var websocket= new WebSocket("ws://127.0.0.1:8081/ws");websocket.onopen = function(event) {console.log("WebSocket握手");
};
websocket.onmessage = function(event) {console.log("WebSocket客户端收到一条消息:",event.data);
};
websocket.onerror = function(event) {console.log("WebSocket发生错误 ");
};
websocket.onclose = function(event) {console.log("WebSocket已关闭");console.log(event);
}
function sendMsg(){   var v=document.getElementById("msg").value;console.log("WebSocket客户端发一条送消息:"+v);websocket.send(v);
}
</script>
<body><input type="text" placeholder="请输入要发送的信息" id="msg" /><input type="button" value="发送" onclick="sendMsg()" />
</body>
</html>

接下来开始写服务端,首先pom文件添加依赖

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

方式1
首先建立一个接受消息的类

public class MyWebSocketHandler implements WebSocketHandler {@Overridepublic void afterConnectionEstablished(WebSocketSession session) {//连接成功之后,应该在这个方法中将session保存起来,通常都用//一个Map来保存,key是用户ID(或其他唯一标识),这样的话想//给哪个用户发送消息,那么就直接拿到那个用户的session,然后//调用session.sendMessage方法发送消息就可以了System.out.println("连接成功");}@Overridepublic void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {System.out.println("客户端过来一条消息,内容是:" + message.getPayload().toString());TextMessage textMessage = new TextMessage("客户端你好,我已经收到你的消息");session.sendMessage(textMessage);}@Overridepublic void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {System.out.println("错误处理");}@Overridepublic void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) {System.out.println("连接关闭");}@Overridepublic boolean supportsPartialMessages() {return false;}
}

然后将上面的类注入到WebSocket相关配置中,启动项目,刷新浏览器即可

@Component
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {//开始我没设置setAllowedOrigins,排查了很久很久,JS就提示//failed,然后没有任何原因,让我很恼火registry.addHandler(new MyWebSocketHandler(), "/ws").setAllowedOrigins("*");}
}

至此方式演示完毕,使用上面的代码就可以实现任何IM功能了,但是还有一个额外的小功能需要说一下,就是方式1的拦截器,如果设置了拦截器,WebSocket请求过来的时候会先走拦截器,这个时候spring会给咱们2个东西,一个是request,一个是Map
request:获取当前请求所有信息,比如请求的URL
map:我们可以往这个map放参数,然后在上面的MyWebSocketHandler中获取到

使用下面的代码设置拦截器

public class MyHandShake implements HandshakeInterceptor {private static final Logger LOG = LoggerFactory.getLogger(HandShake.class);@Overridepublic boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,Map<String, Object> attributes) {attributes.put("name", "兰博");return true;}@Overridepublic void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,Exception exception) {}
}

将拦截器注入到容器中,这需要对前文的代码进行一个修改

@Component
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {// 这行代码比前文的多了一个.addInterceptors(new MyHandShake())registry.addHandler(new MyWebSocketHandler(), "/ws").addInterceptors(new HandShake()).setAllowedOrigins("*");}
}

上述完毕之后,就可以在获取消息时,顺便获取拦截器中设置的name了,例如下面这样

session.getAttributes().get("name").toString();

方式2:很简单,只有这一个类,只要扫描到这类就可以了,不过不适用于多用户聊天

import org.springframework.web.socket.server.standard.ServerEndpointExporter;
import org.springframework.context.annotation.Bean;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;@ServerEndpoint("/ws")
@Component
public class MyWebSocketHandler{@Beanpublic ServerEndpointExporter serverEndpoint() {return new ServerEndpointExporter();}@OnOpenpublic void onOpen(Session session) {System.out.println("连接成功");}@OnClosepublic void onClose(Session session) {System.out.println("连接关闭");}@OnMessagepublic String onMsg(String text) throws IOException {System.out.println("客户端过来一条消息,内容是:" + text);return "客户端你好,我已经收到你的消息";}
}

SpringBoot-Websocket相关推荐

  1. SpringBoot WebSocket Stomp

    关注 "弋凡"(YiFan)微信公众号吧 记录简单笔记 做你的最爱 websocket 是什么? 是一种网络通信协议,很多高级功能都需要它 为什么要使用websocket? 已经有 ...

  2. springboot websocket

    大家好,我是烤鸭: 今天想分享一下springboot+websocket. 之前接到一个需求,需要在页面监听后台的数据(输入邮箱后,需要用户打开邮箱,页面监听用户是否点击激活邮件).之前的实现方式, ...

  3. SpringBoot +WebSocket实现简单聊天室功能实例

    SpringBoot +WebSocket实现简单聊天室功能实例) 一.代码来源 二.依赖下载 三.数据库准备(sql) 数据库建表并插入sql 四.resources文件配置 application ...

  4. springboot websocket 传递 头信息 协议头 token 的前后端解决方案

    文章目录 一.前言 二.js websocket 传递token 2.1 基于协议头 三.后台取出websocket协议头的参数 3.1 取出token 3.2 注意大坑 四.结尾 一.前言 关于sp ...

  5. Springboot + WebSocket 实现在线聊天

    一.后端 1.在Springboot项目的pom.xml中添加依赖 <!--websocket协议--> <dependency><groupId>org.spri ...

  6. springboot+websocket构建在线聊天室(群聊+单聊)

    系列导读: 1.springboot+websocket构建在线聊天室(群聊+单聊) 2.Spring Boot WebSocket:单聊(实现思路) 3.Websocket Stomp+Rabbit ...

  7. SpringBoot WebSocket之多人聊天室实现

    SpringBoot WebSocket之多人聊天室实现 WebSocket简介 什么是WebSocket? 为什么使用WebSocket? WebSocket的技术特点: WebSocket的技术优 ...

  8. Springboot+WebSocket 自动重连机制

    Springboot+WebSocket 自动重连机制 1.WebSocket WebSocket 是一种在单个TCP连接上进行全双工通信的协议,通信协议可能更熟悉的是HTTP,因此,学习WebSoc ...

  9. vue+flv.js+SpringBoot+websocket实现视频监控与回放

    vue+flv.js+SpringBoot+websocket实现视频监控与回放 需求:vue+springboot的项目,需要在页面展示出海康的硬盘录像机连接的摄像头的实时监控画面以及回放功能. 之 ...

  10. 基于 SpringBoot+WebSocket 无DB实现在线聊天室(附源码)

    文章目录 基于 SpringBoot+WebSocket 无DB实现在线聊天室 0 项目说明 0.1 样例展示 0.2 源码地址 1 WebSocket 简介 1.1 HTTP 1.2 WebSock ...

最新文章

  1. 以回调形式使用startActivityForResult方法,并解决Activity被回收的问题
  2. tomcat配置多个web网站的配置详解
  3. 猫眼html源码,50 行代码教你爬取猫眼电影 TOP100 榜所有信息
  4. IOC操作Bean管理XML方式(bean 的生命周期)
  5. linux uniq 命令详解
  6. Visual studio 2010 中文版安装Siverlight 5 beta tools 总结
  7. 深度学习2.0-22.Keras高层接口之自定义层或网络
  8. JDK的KeyTool和KeyStore等加密相关
  9. 几个MATLAB中的函数
  10. 如何制作Win10启动U盘启动盘iso镜像文件
  11. form表单中@submit.prevent作用
  12. matlab生成曲线程序,Matlab绘制频散曲线程序代码(20210119130722).docx
  13. 百度自动驾驶巴士开启收费运营
  14. 利用RSA非对称加密对文本信息进行加密
  15. 《A NEURAL TEXT-TO-SPEECH MODEL UTILIZING BROADCAST DATA MIXED WITH BACKGROUND MUSIC》阅读笔记
  16. MatLab函数:pol2cart()
  17. c语言识别按了esc键_c语言输入esc
  18. Java XStream理解
  19. 技术人总有想写文章的冲动却无疾而终?4个小Tips帮你快速上手~
  20. Python判断一个五位数是否为回文数

热门文章

  1. php请求要通过什么协议,php – 发送多个应用程序协议请求(类似于mailto:)
  2. mysql 5.6 登录 警告_解决mysql登录出现警告问题的简单方法
  3. ftp ---- 虚拟用户登录(实例配置)
  4. java ssm框架做增删改查,使用SSM框架组合实现增删改查的功能
  5. 西工大学计算机专业考研容易吗,2022年西北工业大学计算机专业考研成功经验...
  6. mysql 日志 iteye_MySQL 日志
  7. lisp新建标注式样_[求助]请教一下,如何编定义标注样式的LSP?
  8. textarea统计剩余字数(动态提示)
  9. Spring Boot 使用 Dom4j XStream 操作 Xml
  10. java面向对象编程 漫画_Java面向对象编程(一)