springboot整合websocket实现一对一消息推送和广播消息推送
maven依赖
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-websocket</artifactId>
- </dependency>
常量类
- //webSocket相关配置
- //链接地址
- public static String WEBSOCKETPATHPERFIX = "/ws-push";
- public static String WEBSOCKETPATH = "/endpointWisely";
- //消息代理路径
- public static String WEBSOCKETBROADCASTPATH = "/topic";
- //前端发送给服务端请求地址
- public static final String FORETOSERVERPATH = "/welcome";
- //服务端生产地址,客户端订阅此地址以接收服务端生产的消息
- public static final String PRODUCERPATH = "/topic/getResponse";
- //点对点消息推送地址前缀
- public static final String P2PPUSHBASEPATH = "/user";
- //点对点消息推送地址后缀,最后的地址为/user/用户识别码/msg
- public static final String P2PPUSHPATH = "/msg";
接收前端消息实体
- public class WiselyMessage {
- private String name;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- }
后台发送消息实体
- private String responseMessage;
- public WiselyResponse(String responseMessage){
- this.responseMessage = responseMessage;
- }
- public String getResponseMessage() {
- return responseMessage;
- }
- public void setResponseMessage(String responseMessage) {
- this.responseMessage = responseMessage;
- }
配置websocket
- @Configuration
- // @EnableWebSocketMessageBroker注解用于开启使用STOMP协议来传输基于代理(MessageBroker)的消息,这时候控制器(controller)
- // 开始支持@MessageMapping,就像是使用@requestMapping一样。
- @EnableWebSocketMessageBroker
- public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
- @Override
- public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
- //注册一个Stomp的节点(endpoint),并指定使用SockJS协议。
- stompEndpointRegistry.addEndpoint(Constant.WEBSOCKETPATH).withSockJS();
- }
- @Override
- public void configureMessageBroker(MessageBrokerRegistry registry) {
- //服务端发送消息给客户端的域,多个用逗号隔开
- registry.enableSimpleBroker(Constant.WEBSOCKETBROADCASTPATH, Constant.P2PPUSHBASEPATH);
- //定义一对一推送的时候前缀
- registry.setUserDestinationPrefix(Constant.P2PPUSHBASEPATH);
- //定义websoket前缀
- registry.setApplicationDestinationPrefixes(Constant.WEBSOCKETPATHPERFIX);
- }
- }
service
- @Service
- public class WebSocketService {
- @Autowired
- private SimpMessagingTemplate template;
- /**
- * 广播
- * 发给所有在线用户
- *
- * @param msg
- */
- public void sendMsg(WiselyResponse msg) {
- template.convertAndSend(Constant.PRODUCERPATH, msg);
- }
- /**
- * 发送给指定用户
- * @param users
- * @param msg
- */
- public void send2Users(List<String> users, WiselyResponse msg) {
- users.forEach(userName -> {
- template.convertAndSendToUser(userName, Constant.P2PPUSHPATH, msg);
- });
- }
- }
控制器
- @Controller
- public class WsController {
- @Resource
- WebSocketService webSocketService;
- @MessageMapping(Constant.FORETOSERVERPATH)//@MessageMapping和@RequestMapping功能类似,用于设置URL映射地址,浏览器向服务器发起请求,需要通过该地址。
- @SendTo(Constant.PRODUCERPATH)//如果服务器接受到了消息,就会对订阅了@SendTo括号中的地址传送消息。
- public WiselyResponse say(WiselyMessage message) throws Exception {
- List<String> users = Lists.newArrayList();
- users.add("d892bf12bf7d11e793b69c5c8e6f60fb");//此处写死只是为了方便测试,此值需要对应页面中订阅个人消息的userId
- webSocketService.send2Users(users, new WiselyResponse("admin hello"));
- return new WiselyResponse("Welcome, " + message.getName() + "!");
- }
- }
页面
- <!DOCTYPE html>
- <html xmlns:th="http://www.thymeleaf.org">
- <head>
- <meta charset="UTF-8" />
- <title>Spring Boot+WebSocket+广播式</title>
- </head>
- <body onload="disconnect()">
- <noscript><h2 style="color: #ff0000">貌似你的浏览器不支持websocket</h2></noscript>
- <div>
- <div>
- <button id="connect" onclick="connect();">连接</button>
- <button id="disconnect" disabled="disabled" onclick="disconnect();">断开连接</button>
- </div>
- <div id="conversationDiv">
- <label>输入你的名字</label><input type="text" id="name" />
- <button id="sendName" onclick="sendName();">发送</button>
- <p id="response"></p>
- <p id="response1"></p>
- </div>
- </div>
- <!--<script th:src="@{sockjs.min.js}"></script>
- <script th:src="@{stomp.min.js}"></script>
- <script th:src="@{jquery.js}"></script>-->
- <script src="https://cdn.bootcss.com/sockjs-client/1.1.4/sockjs.min.js"></script>
- <script src="https://cdn.bootcss.com/stomp.js/2.3.3/stomp.min.js"></script>
- <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
- <script th:inline="javascript">
- var stompClient = null;
- //此值有服务端传递给前端,实现方式没有要求
- var userId = [[${userId}]];
- function setConnected(connected) {
- document.getElementById('connect').disabled = connected;
- document.getElementById('disconnect').disabled = !connected;
- document.getElementById('conversationDiv').style.visibility = connected ? 'visible' : 'hidden';
- $('#response').html();
- }
- function connect() {
- var socket = new SockJS('/endpointWisely'); //1连接SockJS的endpoint是“endpointWisely”,与后台代码中注册的endpoint要一样。
- stompClient = Stomp.over(socket);//2创建STOMP协议的webSocket客户端。
- stompClient.connect({}, function(frame) {//3连接webSocket的服务端。
- setConnected(true);
- console.log('开始进行连接Connected: ' + frame);
- //4通过stompClient.subscribe()订阅服务器的目标是'/topic/getResponse'发送过来的地址,与@SendTo中的地址对应。
- stompClient.subscribe('/topic/getResponse', function(respnose){
- showResponse(JSON.parse(respnose.body).responseMessage);
- });
- //4通过stompClient.subscribe()订阅服务器的目标是'/user/' + userId + '/msg'接收一对一的推送消息,其中userId由服务端传递过来,用于表示唯一的用户,通过此值将消息精确推送给一个用户
- stompClient.subscribe('/user/' + userId + '/msg', function(respnose){
- console.log(respnose);
- showResponse1(JSON.parse(respnose.body).responseMessage);
- });
- });
- }
- function disconnect() {
- if (stompClient != null) {
- stompClient.disconnect();
- }
- setConnected(false);
- console.log("Disconnected");
- }
- function sendName() {
- var name = $('#name').val();
- //通过stompClient.send()向地址为"/welcome"的服务器地址发起请求,与@MessageMapping里的地址对应。因为我们配置了registry.setApplicationDestinationPrefixes(Constant.WEBSOCKETPATHPERFIX);所以需要增加前缀/ws-push/
- stompClient.send("/ws-push/welcome", {}, JSON.stringify({ 'name': name }));
- }
- function showResponse(message) {
- var response = $("#response");
- response.html(message);
- }
- function showResponse1(message) {
- var response = $("#response1");
- response.html(message);
- }
- </script>
- </body>
- </html>
springboot整合websocket实现一对一消息推送和广播消息推送的更多相关文章
- Springboot整合Websocket遇到的坑
Springboot整合Websocket遇到的坑 一.使用Springboot内嵌的tomcat启动websocket 1.添加ServerEndpointExporter配置bean @Confi ...
- SpringBoot 整合 WebSocket
SpringBoot 整合 WebSocket(topic广播) 1.什么是WebSocket WebSocket为游览器和服务器提供了双工异步通信的功能,即游览器可以向服务器发送消息,服务器也可以向 ...
- SpringBoot整合websocket简单示例
依赖 <!-- springboot整合websocket --> <dependency> <groupId>org.springframework.boot&l ...
- springboot整合websocket原生版
目录 HTTP缺点 HTTP websocket区别 websocket原理 使用场景 springboot整合websocket 环境准备 客户端连接 加入战队 微信公众号 主题 HTTP请求用于我 ...
- SpringBoot整合WebSocket实现前后端互推消息
小编写这篇文章是为了记录实现WebSocket的过程,受不了啰嗦的同学可以直接看代码. 前段时间做项目时设计了一个广播的场景,具体业务不再赘述,最终要实现的效果就是平台接收到的信息实时发布给所有的用户 ...
- WebSocket的简单认识&SpringBoot整合websocket
1. 什么是WebSocket?菜鸟对websocket的解释如下 WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议. WebSocket 使得客户端和服务 ...
- Springboot整合WebSocket实现网页版聊天,快来围观!
- 【Java分享客栈】SpringBoot整合WebSocket+Stomp搭建群聊项目
前言 前两周经常有大学生小伙伴私信给我,问我可否有偿提供毕设帮助,我说暂时没有这个打算,因为工作实在太忙,现阶段无法投入到这样的领域内,其中有两个小伙伴又问到我websocket该怎么使用,想给自己的 ...
- springboot整合websocket高级版
目录 sockjs介绍 产生的原因 环境搭建 springboot整合sockjs 使用场景 聊天室开发 点对点通信 群聊 效果 总结 加入战队 微信公众号 上一章节我们说了websocket的优缺点 ...
随机推荐
- Centos系统下 Gitolite安装与相关配置(git权限控制软件)
确保已经安装了最新版的git服务Git源码安装 Linux指定安装目录,并且创建了 用户名为git 的账户 修改.gitolite.rc #设置gitolite管理的仓库目录 GL_REPO_BAS ...
- idea xml版本修改问题
STEP 1.选中模块 STEP 2.file---->Project Structure---->Facets---->把相应模块的给删除"-"----> ...
- linux日常命令之二
ps -ef 查看当前系统所有进程,ps 进程查看命令,-e 显示所有进程,-f 全格式. free -h 查看系统实际使用内存的情况. 显示格式为: total used f ...
- vue 15分钟倒计时
HTML: <span>{{minute}}:{{second}}</span> script: 一 二 // 倒计时 num(n) { return n & ...
- Codeforces 215D. Hot Days(贪心)
题意 有nnn个地区和mmm个学生,在第iii个地区时,车上有kik_iki个学生,车内温度(当前城市的温度tit_iti+当前车上的学生kik_iki)不能超过TiT_iTi,否则,赔偿每个 ...
- Web前端入门教程之浏览器兼容问题及解决方法
JavaScript 被称为JS,是作为浏览器的内置脚本语言,为我们提供操控浏览器的能力,可以让网页呈现出各种特殊效果,为用户提供友好的互动体验.JS是Web前端入门教程中的重点和难点,而浏览器兼容性 ...
- Python hashlib&hmac 模块
用于加密相关的操作,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法 hashlib模块示例: import hashlib m = hashlib. ...
- 【算法和数据结构】_14_小算法_Blank字符替换
/* 本程序用来将输入的制表符替换为\t, 而将退格替换为\b, 将反斜杠替换为\\ */ #include <stdio.h> #include <stdlib.h> typ ...
- SpringBoot项目单元测试
关于SpringBoot的单元测试,描述一下三种单元测试的方式. 1.约定 单元测试代码写在src/test/java目录下单元测试类命名为*Test,前缀为要测试的类名 2. 使用mock方式单元测 ...
- bzoj5048: 塌陷的牧场
Description 农夫小Q将他的奶牛们饲养在一个长n宽m的矩形网格牧场中.行从上到下依次编号为1到n,列从左往右依次编号为1 到m.为了防止奶牛们逃跑,小Q在牧场外圈安装了一排电网,只要奶牛走出 ...