springboot集成websocket
admin
2024-03-27 19:16:17
0

简介

STOMP的全称是Simple (or Streaming) Text Orientated Messaging Protocol,一种简单的流式文本传输协议。对于不支持websocket的浏览器我们需要通过STOMP来兼容,兼容的需要俩个组件,一个是前端需要的SockJs,一个是后端需要的WebSocketMessageBroker。SockJs一种让前端可以支持socket通信的技术解决方案,WebSocketMessageBroker是基于消息组件实现的一种通信协议。

实现

一、在后端springboot服务中添加依赖

org.springframework.bootspring-boot-starter-websocket2.2.6.RELEASE

二、添加websocketConfig

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;/*** @author liqiang*/
@Slf4j
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {@Overridepublic void registerStompEndpoints(StompEndpointRegistry registry) {// 增加一个后端服务端点registry.addEndpoint("/socket").setAllowedOrigins("*").withSockJS();// 增加一个前端服务端点registry.addEndpoint("/wsuser").setAllowedOrigins("*").withSockJS();// 配置客户端尝试连接地址
//        registry.addEndpoint("/ws").setAllowedOrigins("*").withSockJS();}/*** 定义服务器端点请求和订阅前缀* @param registry*/@Overridepublic void configureMessageBroker(MessageBrokerRegistry registry) {// 客户端订阅路径前缀registry.enableSimpleBroker("/sub", "/user");// 服务端点请求前缀registry.setApplicationDestinationPrefixes("/request");// 设置广播节点/*registry.enableSimpleBroker("/topic", "/user");// 客户端向服务端发送消息需有/app 前缀registry.setApplicationDestinationPrefixes("/app");*/// 指定用户发送(一对一)的前缀 /user/registry.setUserDestinationPrefix("/user/");}
}

解释:
1、

 registry.addEndpoint("/socket").setAllowedOrigins("*").withSockJS();

addEndpoint添加一个端点,用于前端创建socket连接,在示例中我们创建了俩个端点,这里传差的使用互补影响,不如我发送的时候创建链接使用的是socket端点,而接收信息的时候使用的wsuser端点,这样也是可以互通信息的。
setAllowedOrigins(“*”)这个是设置跨域的。

2、

registry.enableSimpleBroker("/sub", "/user");

设置客户端订阅的前缀

registry.setApplicationDestinationPrefixes("/request");

设置前端请求后端发送信息的前缀

registry.setUserDestinationPrefix("/user/");

设置一对一转发信息时的用户前缀

三、实现广播方式

1、前端代码

1.1 发送信息前端代码



websocket STOMP


websocket兼容STOMP测试11

跳转到消息接收页

1.2接收信息前端代码



websocket-stomp-receive





等待接收消息

解释:
在前端代码中主要的发送信息和接收信息的部分在js中,如下截取出来:

var stompClient = null;// 设置连接function connect() {// 定义请求服务器的端点var socket = new SockJS('/socket');// stomp客户端stompClient = Stomp.over(socket);// 连接服务器端点stompClient.connect({}, function (frame) {// 建立连接后的回调,这个是设置连接状态的setConnected(true);})}// 断开socket连接function disconnect() {if (stompClient != null) {stompClient.disconnect();}setConnected(false);console.log("Disconnected");}// 向/request/send服务端发送消息function sendMessage() {var message = $("#message").val();// 发送消息到"/request/send",其中/request是服务器定义的前缀// 而/send则是@MessageMapping所配置的路径stompClient.send("/request/send", {}, message);}connect();
var noticeSocket = function () {// 连接服务器端点var s = new SockJS('/socket');//客户端var stompClient = Stomp.over(s);stompClient.connect({}, function () {console.log("notice socket connected !");// 订阅消息地址,这里的/sub是在配置里设置的sub前缀,/sub/chat是后端服务代码中@SendTo注解消息路由到的订阅路径中stompClient.subscribe('/sub/chat', function (data) {$('#receive').html(data.body);});});};noticeSocket();

后端服务代码

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import javax.annotation.Resource;
import java.security.Principal;/*** @author */
@Controller
@RequestMapping("/device/ws")
@Api(tags = "WebsocketController")
public class WebsocketController {private final Logger logger = LoggerFactory.getLogger(WebsocketController.class);@MessageMapping("/send")@SendTo("/sub/chat")public String sendMessage(String value) {logger.info("发送消息内容:{}", value);return value;}/*** 测试发送广播消息的前端* @return*/@GetMapping("/test")public String test() {return "request";}/*** 测试接受广播消息的前端* @return*/@GetMapping("/user")public String user() {return "user";}
}

@MessageMapping注解的/send就是前端发送时路径的一部分,再加上服务前缀request,就是前端发送信息的完整路径/request/send.
@SendTo注解的路径是将要消息路由到的路径,正好是前端订阅的路径。
发送过来的消息可以在这里进行整理或处理后再转发出去

实现一对一发送

前端代码

发送信息的前端代码



websocket STOMP


websocket兼容STOMP测试11

跳转到消息接收页

stompClient.send 把信息发送到后端,
/requst 是服务端统一的前缀路径
/sendUser 是@MessageMaping的路径

接收信息的前端



websocket-stomp-receive





等待接收消息

解释:

// 订阅消息地址,stompClient.subscribe('/sub/admin/queue/customer', function (data) {console.log("接受到的消息:"+data)$('#receive').html(data.body);});

/sub/admin/queue/customer
/sub 是接收信息的订阅的前缀
/admin 是指定的user
/queue/customer 是转发信息的destination,目的地

后端服务代码


import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import javax.annotation.Resource;
import java.security.Principal;/*** @author */
@Controller
@RequestMapping("/device/ws")
@Api(tags = "WebsocketController")
public class WebsocketController {private final Logger logger = LoggerFactory.getLogger(WebsocketController.class);@Resourceprivate SimpMessagingTemplate simpMessagingTemplate;@MessageMapping("/sendToUser")public void sendToUser(Principal principal, String body,String token) {
//        String srcUser = principal.getName();System.out.println("传入的token是:"+token);String[] args = body.split(": ");String desUser = args[0];String message = String.format("【%s】给你发来消息:%s", "mali", args[1]);// 发送到用户和监听地址simpMessagingTemplate.convertAndSendToUser(desUser, "/queue/customer", message);}/*** 测试发送指定用户的前端* @return*/@GetMapping("/sendUser")public String sendUser() {return "sendUser";}/*** 接受指定用户的前端* @return*/@GetMapping("/userId")public String userId() {return "userId";}
}
 @MessageMapping("/sendToUser")public void sendToUser(Principal principal, String body,String token) {
//        String srcUser = principal.getName();System.out.println("传入的token是:"+token);String[] args = body.split(": ");String desUser = args[0];String message = String.format("【%s】给你发来消息:%s", "mali", args[1]);// 发送到用户和监听地址simpMessagingTemplate.convertAndSendToUser(desUser, "/queue/customer", message);}

这个方法正是前端发送消息的路径/sendToUser,路由消息的时候使用simpMessageTemplate.convertAndToUser,destUser是前端传过来的,
/queue/customer也是用户订阅的目的地址,发送的消息是message

相关内容

热门资讯

黄金ETF持仓量报告解读(20... 截至7月23日,全球最大的黄金ETF SPDR Gold Trust持仓量为1009.298吨,较前...
珠宝店银回收有哪些行业通用标准 首饰加工行业金属废料处置背景 首饰加工行业是贵金属废料产生的核心场景之一,珠宝店在日常经营、首饰加...
德明利:控股股东、董事长李虎自... 德明利公告称,公司控股股东、董事长李虎自愿承诺自2026年7月27日起12个月内,不以任何方式减持其...
十倍存储牛股德明利:董事长承诺... 7月24日盘后,德明利(001309.SZ)公告称,公司控股股东、董事长李虎自愿承诺自2026年7月...
外资公募二季度持仓披露 聚焦光... 观点网讯:近日,随着公募基金二季报披露收官,贝莱德、富达、路博迈、安联、联博等外商独资公募基金的二季...
政企合作、地方产业扶持为什么更... 各地政府与产业园区在大健康产业招商中,普遍优先扶持实体生产型企业,对轻资产招商、流量型项目基本不予扶...
原创 特... 近日美加贸易再起波澜,美国总统特朗普宣布对价值约 200 亿美元的加拿大进口商品加征 50% 关税,...
日本消费者大举购入珠宝,对冲日... 7月24日,财闻海外资讯消息,通胀高企、日元持续走弱,日本民众纷纷抢购奢侈珠宝,将其当作保值避险资产...
Anthropic杀入AI制药... 来源:智药局 从挖人才到建社群,Anthropic对AI制药领域的野心,实在太明显了。 近日,Ant...
小红书:启动人力系统复盘,邀请... 小红书上市的传闻,传了也有一个多月了吧。 市场迟迟蹲不到官方的回应,导致坊间一度是众说纷纭…结果没想...
“蛋白粉里没蛋白”:达开生物蛋... 图片来源:视觉中国 蓝鲸新闻7月24日讯(记者 代紫庭)当不少乳清蛋白粉一路涨到一罐数百元时,500...
Anthropic被曝9月上市... 智东西 编译 | 茄子 编辑 | 程茜 智东西7月24日消息,昨日,The Information援...
追加3亿美元投资扩大美国生产布... 7月24日, 百济神州(06160.HK)涨超4%,截至发稿,涨4.02%,报202.6港元,成交额...
段永平换仓了。。盯上这些科技股 全球科技股巨震之际,段永平开始换仓了。 段永平近日在社交平台回复网友时,透露了自己最新操作。 网友问...
原创 为... 为了不让中国“占便宜”,欧盟“放过了”俄罗斯。 日前,欧盟第21轮对俄制裁遭到希腊否决。无奈之下,欧...
圣邦股份跌3.32%,成交额1... 来源:新浪证券-红岸工作室 7月24日,圣邦股份跌3.32%,成交额11.29亿元,换手率1.86%...
新华鲜报丨企业年金个人账户明年... 无论你在哪里干、社会保险接着算,这句话在企业年金上有了新体现。 7月24日,《企业年金个人账户转移接...
原创 曹... 饭桌上最容易吵翻天的话题,除了催婚,大概就是买房。一个说手里有房心里不慌,一个说背上房贷就是给银行打...
盒马超盒算NB首进西南 成都6... 观点网讯:7月24日,盒马旗下平价社区超市品牌超盒算NB正式进入西南市场,首批6家门店在成都同步开业...