最新要闻
- 天津网约车从业资格实现线上约考
- 单风扇就是好看!RTX 40第一次做成ITX迷你卡 5款集中爆发
- 高颜值87键!影驰Keychron K8 Pro星曜娘联名键盘图赏 全球今头条
- 深圳一大厦异响振动居民被疏散:官方已启动调查_每日热文
- ChatGPT连夜登陆iOS 免费无广告、还支持语音
- 全球今头条!爱马仕推出AirPods Pro保护皮套:售价7100元 够买5个耳机
- 【环球聚看点】奥普光电:公司参与了该项目的机械及装校联调工作
- 欧联杯:塞维利亚胜尤文图斯
- 当前播报:印度:我们的智能手机取得极大成功!苹果等加大布局 曾称接下来靠他们
- 曝iPhone 15 Plus影像升级为4800万像素:但因良率问题量产延期 今日最新
- 全球热点!荣耀90系列屏幕升级:首发3840Hz零风险调光护眼屏
- 环球速讯:53°飞天遭哄抢 茅台自营电商i茅台用户超4000万:销售230亿
- 1900万没了!一梅赛德斯AMG ONE运输途中被烧成焦炭:原因未明_热消息
- 海通国际发布先导智能研报
- 当前快播:睡觉时枕边有手机会得脑瘤吗?网友吵翻:没明确答案 你怎么看?
- 纯白机身 颜值天花板!魅族20告白礼盒上架:3199元起_世界今头条
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
SpringBoot实现WebSocket发送接收消息 + Vue实现SocketJs接收发送消息
SpringBoot实现WebSocket发送接收消息 + Vue实现SocketJs接收发送消息
参考:
1、https://www.mchweb.net/index.php/dev/887.html
(相关资料图)
2、https://itonline.blog.csdn.net/article/details/81221103?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2~default~CTRLIST~default-1-81221103-blog-121078449.pc_relevant_aa&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2~default~CTRLIST~default-1-81221103-blog-121078449.pc_relevant_aa&utm_relevant_index=1
3、https://blog.csdn.net/yingxiake/article/details/51224569
使用场景
广播模式:使用场景:给所有连接了这个通道的客户端发送消息。
- convertAndSend()
- @SendTo
点对点模式:使用场景:单独给当前用户发送消息。
下面两种方式,都默认加了一个前缀:/user
convertAndSendToUser()
@SendToUser
一、后端SpringBoot + WebSocket基础配置
1、导包
org.springframework.boot spring-boot-starter-websocket
2、配置config
- 细节:必须配置跨域。低版本的SpringBoot(2.1.5.RELEASE 就不行)不行,需要使用高版本。低版本的解决方案还未找到。
- 跨域配置使用:.setAllowedOriginPatterns("*")。。不能使用:.setAllowedOrigins("*")
package com.cc.ws.config;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;/** * @EnableWebSocketMessageBroker 的作用
* 注解开启使用STOMP协议来传输基于代理(message broker)的消息, * 这时控制器支持使用 @MessageMapping,就像使用 @RequestMapping一样 * @author cc * */@Configuration@EnableWebSocketMessageBrokerpublic class WebSocketConfig implements WebSocketMessageBrokerConfigurer { /** 启动简单Broker
* 表示客户端订阅地址的前缀信息,也就是客户端接收服务端消息的地址的前缀信息
* 代理的名字:都是自定义的
* * /user 点对点(默认也是/user,可以自定义,但是必须和setUserDestinationPrefix中的设置一致) * /topic1 广播模式1 * /topic2 广播模式2 * * /mass 广播模式:群发 */ @Override public void configureMessageBroker(MessageBrokerRegistry registry) { registry.enableSimpleBroker( "/user", "/topic1", "/topic2", "/mass" ); // 点对点使用的订阅前缀(客户端订阅路径上会体现出来),不设置的话,默认也是 /user/ // 注意,这里必须和上面设置的Broker:/user 一致(两个都可以自定义,但必须一致)。否则连接不上 registry.setUserDestinationPrefix("/user/"); // 指服务端接收地址的前缀,意思就是说客户端给服务端发消息的地址的前缀// registry.setApplicationDestinationPrefixes("/socket"); } /** * 这个方法的作用是添加一个服务端点,来接收客户端的连接。 * registry.addEndpoint("/socket")表示添加了一个/socket端点,客户端(前端)就可以通过这个端点来进行连接。 * withSockJS()的作用是开启SockJS支持。 * @param registry registry */ @Override public void registerStompEndpoints(StompEndpointRegistry registry) { // 注册一个STOMP的endpoint端点,并指定使用SockJS协议 // 前端使用这个地址连接后端 WebSocket接口 registry.addEndpoint("/broadcast", "/point") // 允许所有源跨域。还可以指定ip配置:http://ip:* // 低版本的SpringBoot(2.1.5.RELEASE 就不行)不行 .setAllowedOriginPatterns("*") .withSockJS(); }}
3、启动类,配置定时器
- @EnableScheduling
@SpringBootApplication@EnableSchedulingpublic class WebSocketDemoApplication { public static void main(String[] args) { SpringApplication.run(WebSocketDemoApplication.class, args); }}
二、前端基础配置
let socket1 = new SockJS("http://服务器ip:服务器端口/broadcast"); let stompClient1 = Stomp.over(socket1);//广播模式 stompClient1.connect({}, (frame) => { stompClient1.subscribe("/topic1/", (message) => { console.log(message.body); }); });
三、后端不接收,只发送
使用spring Scheduled 定时发送消息
直接使用:SimpMessagingTemplate 的 convertAndSend广播模式 和 convertAndSendToUser点对点模式
1、后端
- 注意点对点发送:
convertAndSendToUser的默认前缀(/user)是在WebSocketConfig配置文件中配置的。
代码:
@Resource private SimpMessagingTemplate simpMsgTemp; /** 广播推送消息1:会发送给所有连接了 topic1 这个通道的客户端。 * topic1:在Broker中配置 **/ @Scheduled(cron = "0/1 * * * * ?") public void getSocket(){ String msg = String.format("%s 的第 %s 个消息", "topic1", LocalDateTime.now().getSecond()); log.info("{}",msg); simpMsgTemp.convertAndSend("/topic1/", msg); } /** 广播推送消息2:多指定一个uri。相当于另一条通道(推荐使用) * 自定义url后缀,还可以实现用户和用户单点发送。 * topic2:在Broker中配置 * custom:是自定义的 */ @Scheduled(cron = "0/1 * * * * ?") public void getSocketUser(){ String msg = String.format("topic2 的第 %s 个消息", LocalDateTime.now().getSecond()); log.info("{}",msg); simpMsgTemp.convertAndSend("/topic2/custom" ,msg); } /**点对点发送 convertAndSendToUser(第一个参数:一般是用户id) * -> 假如用户id是1。用用户id是1的在两个地方登陆了客户端(比如不同的浏览器登陆同一个用户), * -> convertAndSendToUser会把消息发送到用户1登陆的两个客户端中 * 发送到:/user/{userId}/cs 下。cs是自定义的,且必须自定义一个。 */ @Scheduled(cron = "0/1 * * * * ?") public void pointToPoint(){ //这个用户id是后端获取的当前登陆的用户id String userId = "123"; String msg = String.format("点对点:第 %s 个消息。用户id:%s", LocalDateTime.now().getSecond(), userId); log.info("{}",msg); //发送 simpMsgTemp.convertAndSendToUser(userId,"/cs/" ,msg); }
2、前端
- 注意点对点的接收方式,用户id需要取出前端存的用户id
//这样才能同时接收后端来的三套不同通道的消息。 // broadcast 和后端:registerStompEndpoints中的配置必须一致 // point 和后端:registerStompEndpoints中的配置必须一致 // broadcast、point 也可以只用一个,这里只是为了好区分。 let socket1 = new SockJS("http://172.16.8.1:8099/broadcast"); let socket2 = new SockJS("http://172.16.8.1:8099/broadcast"); let socket3 = new SockJS("http://172.16.8.1:8099/point"); // console.log("wb:" + socket) let stompClient1 = Stomp.over(socket1); let stompClient2 = Stomp.over(socket2); let stompClient3 = Stomp.over(socket3); // ----------------广播模式1-------------------- stompClient1.connect({}, (frame) => { console.log("-----------frame1", frame) stompClient1.subscribe("/topic1/", (message) => { console.log(message.body); this.msg = message.body; // console.log(JSON.parse(message.body)); }); }); // ----------------广播模式2-------------------- stompClient2.connect({}, (frame) => { console.log("-----------frame2", frame) stompClient2.subscribe("/topic2/custom", (message) => { console.log(message.body); this.user = message.body; // console.log(JSON.parse(message.body)); }); }); // ----------------点对点模式-------------------- //前端获取的 userId let userId = "123"; //连接WebSocket服务端 stompClient3.connect({},(frame) => { console.log("Connected:" + frame); stompClient3.subscribe("/user/" + userId + "/cs/", (response) => { this.peer = response.body; }); });
四、后端接收、接收后再发送
- 也可以只接收消息,不发送。看业务需求。
- 使用 @MessageMapping接收前端发送过来的消息
- 使用:@SendTo广播模式、@SendToUser点对点模式
- 使用:SimpMessagingTemplate 的 convertAndSend广播模式 和 convertAndSendToUser点对点模式
1、后端
@Resource private SimpMessagingTemplate simpMsgTemp; /** 广播模式一、接收前端的消息,处理后给前端返回一个消息。
* 后端 把消息处理后 发送到 /mass/getResponse 路径下 * * - @MessageMapping("/massRequest1") :作用:接收前端来的消息。类似于@RestController
* - @SendTo("/mass/getResponse1"):作用跟convertAndSend类似,广播发给与该通道相连的客户端。SendTo 发送至 Broker 下的指定订阅路径
* - @SendToUser("/mass/getResponse1"):作用跟convertAndSendToUser类似,定点发送。SendTo 发送至 Broker 下的指定订阅路径
* - /mass 必须在配置文件配置
* - /getResponse1 自定义的后缀
*
*/ @MessageMapping("/massRequest1") @SendTo("/mass/getResponse1") public String mass1(String chatRoomRequest){ //处理前端消息…… log.info("前端消息:{}",chatRoomRequest); //返回消息 return "@SendTo 广播一(单次) 后端处理完成!"; } /** 广播模式二、接收前端的消息,可以多次给前端发消息 * /mass 必须在配置文件配置 * /getResponse2 自定义的后缀 */ @MessageMapping("/massRequest2") public void mass2(String chatRoomRequest){ log.info("前端的消息:{}",chatRoomRequest); for (int i = 0; i < 5; i++) { String msg = "后端处理后的 广播二(多次):" + i; simpMsgTemp.convertAndSend("/mass/getResponse2", msg); } simpMsgTemp.convertAndSend("/mass/getResponse2", "后端处理后的 广播二(多次),后端处理完成!"); } /** 点对点一、接收前端消息,只能返回一次消息(必须登陆系统才能使用。)
* 只有发送原始消息的客户端才会收到响应消息,而不是所有连接的客户端都会收到响应消息。 * /alone/getResponse1:自定义的,不需要在配置文件配置。 * * @SendToUser
* 默认该注解前缀为 /user * broadcast属性,表明是否广播。就是当有同一个用户登录多个session时,是否都能收到。取值true/false. * * @param principal Principal :登陆用户的信息,需要使用spring s安全框架写入信息? */ @MessageMapping("/aloneRequest1") @SendToUser("/alone/getResponse1") public String alone1(String chatRoomRequest){ //处理前端消息…… log.info("前端消息:{}",chatRoomRequest); //返回消息 return "@SendToUser 点对点一(单次) 后端处理完成!"; } /** 点对点二、接收前端消息,可以多次给前端发消息 * convertAndSendToUser —— 发送消息给指定用户id的 * 如果用户1在两个地方(A/B)登陆可以客户端,并且连接了该通道,其中一个如A给后端发消息,后端返回消息,A/B两个地方都会收到消息 * * - @MessageMapping("/aloneRequest2") 接收前端指定用户消息,
* - /alone/getResponse2 不用在配置文件中配置
* - 返回消息 发送到 user/{userId}/alone/getResponse2 下 (定点发送)
*
*/ @MessageMapping("/aloneRequest2") public void alone2(String chatRoomRequest){ //后端获取的当前登陆的用户的id(和前端一致) String userId = "456"; log.info("前端的消息:{}",chatRoomRequest); for (int i = 0; i < 5; i++) { String msg = "后端处理后的 点对点二(多次):" + i; simpMsgTemp.convertAndSendToUser(userId,"/alone/getResponse2", msg); } simpMsgTemp.convertAndSendToUser(userId,"/alone/getResponse2", "后端处理后的 点对点二(多次),后端处理完成!"); }
2、前端
- 3点对点一 未实现。
//连接SockJS的 broadcast let socket1 = new SockJS("http://172.16.8.7:8099/broadcast"); let socket2 = new SockJS("http://172.16.8.7:8099/broadcast"); let socket3 = new SockJS("http://172.16.8.7:8099/point"); let socket4 = new SockJS("http://172.16.8.7:8099/point"); //使用STMOP子协议的WebSocket客户端 let stompClient1 = Stomp.over(socket1); let stompClient2 = Stomp.over(socket2); let stompClient3 = Stomp.over(socket3); let stompClient4 = Stomp.over(socket4); //1广播模式一 stompClient1.connect({},(frame) => { console.log("广播模式一:" + frame); //1发送消息 stompClient1.send("/massRequest1",{},"我是前端来 广播模式一 的消息!"); //2接收消息 stompClient1.subscribe("/mass/getResponse1",(response) => { this.broadcast1 = response.body }); }); //2广播模式二 stompClient2.connect({},(frame) => { console.log("广播模式二:" + frame); //1发送消息 stompClient2.send("/massRequest2",{},"我是前端来 广播模式二 的消息"); //2接收消息 stompClient2.subscribe("/mass/getResponse2",(response) => { this.broadcast2 = response.body }); }); //3点对点一 :必须登陆系统才能实现。要往:Principal设置用户登陆信息才行 //1发送消息 // stompClient3.send("/aloneRequest1",{},"我是前端来 点对点一 的消息"); stompClient3.connect({},(frame) => { console.log("点对点一1:" + frame); stompClient3.send("/aloneRequest1",{},"我是前端来 点对点一 的消息"); //2接收消息 stompClient3.subscribe("/user/alone/getResponse1" ,(response) => { console.log("-------response.body", response.body) this.point1 = response.body }); }); //4点对点二:必须获取现在登陆了的用户id,且必须和后端一致才行。 stompClient4.connect({},(frame) => { console.log("点对点二:" + frame); //1发送消息 stompClient4.send("/aloneRequest2",{},"我是前端来 点对点二 的消息"); //2接收消息 //前端获取的当前登陆的用户userId(和后端一致) let userId = "456"; stompClient4.subscribe("/user/"+userId+"/alone/getResponse2",(response) => { this.point2 = response.body }); });
关键词:
-
SpringBoot实现WebSocket发送接收消息 + Vue实现SocketJs接收发送消息
SpringBoot实现WebSocket发送接收消息+Vue实现SocketJs接收发送消息 参考:1、https: www mchweb net i
来源: SpringBoot实现WebSocket发送接收消息 + Vue实现SocketJs接收发送消息
创新灵感来源于用户实践,TDengine 首次公开四项专利申请 每日消息
天津网约车从业资格实现线上约考
单风扇就是好看!RTX 40第一次做成ITX迷你卡 5款集中爆发
高颜值87键!影驰Keychron K8 Pro星曜娘联名键盘图赏 全球今头条
深圳一大厦异响振动居民被疏散:官方已启动调查_每日热文
ChatGPT连夜登陆iOS 免费无广告、还支持语音
全球今头条!爱马仕推出AirPods Pro保护皮套:售价7100元 够买5个耳机
【环球聚看点】奥普光电:公司参与了该项目的机械及装校联调工作
Qt+QtWebApp开发笔记(二):http服务器日志系统介绍、添加日志系统至Demo测试
易基因:m5C高甲基化介导EGFR突变的非小细胞肺癌耐药潜在机理
焦点热讯:ipa文件怎么安装到iPhone手机上?
ipa文件怎么安装到iPhone手机上?
聊聊Seata分布式事务解决方案的AT模式_每日观察
科创板收盘播报:科创50指数涨0.52% 次新股表现活跃 全球视讯
欧联杯:塞维利亚胜尤文图斯
当前播报:印度:我们的智能手机取得极大成功!苹果等加大布局 曾称接下来靠他们
曝iPhone 15 Plus影像升级为4800万像素:但因良率问题量产延期 今日最新
全球热点!荣耀90系列屏幕升级:首发3840Hz零风险调光护眼屏
环球速讯:53°飞天遭哄抢 茅台自营电商i茅台用户超4000万:销售230亿
1900万没了!一梅赛德斯AMG ONE运输途中被烧成焦炭:原因未明_热消息
海通国际发布先导智能研报
Lerna 备忘清单_开发速查表分享
CF1512D Corrupted Array 题解 天天观点
全球实时:Blazor实战——Known框架快速开始
【解决方法】家用路由器的复位/重置(reset)操作,解决管理员后台密码遗忘
当前快播:睡觉时枕边有手机会得脑瘤吗?网友吵翻:没明确答案 你怎么看?
纯白机身 颜值天花板!魅族20告白礼盒上架:3199元起_世界今头条
王小川:10年后机器智慧会超过人类 AI迭代周期成倍递减
并非“大更新”?消息称Win11 23H2仅基于22H2优化改进
每日时讯!焦点科技李磊:小语种覆盖全球超5万亿美元的市场
测试管理快速入门
【天天新要闻】上海丨阿里云 Serverless 技术实战营邀你来玩!
环球今日报丨360浏览器修改主页不会动_360浏览器修改主页
你会买吗?一块京A摩托车牌照价格涨破50万:揭秘为何要这么贵?-天天快播
医生用一根针帮患癌老人冻死肿瘤 网友称神奇:以为是中医针灸
生理期可以喝普洱茶吗_生理期有绝对禁忌事项吗_快消息
Centos7 设置定时任务
泰国进口乳胶!网易严选乳胶垫、枕头大促:54元起
iQOO Pad搭载12.1英寸巨屏:2.8K分辨率、144Hz高刷 当前要闻
【世界聚看点】华为5倍薪酬再招天才少年!任正非:破题能力最重要 不是综合素质
当前视点!520用更好的长焦镜头表达爱意:华为P60 Pro长焦人像 让爱不分昼夜
华为新款家庭存储支持断电保护电源:停电自动关机、来电自动开机_世界球精选
观速讯丨2023中央财经大学在职课程培训班怎么样?
【GPT-4理论篇-1】GPT-4核心技术探秘
软件工程快速入门(下)-天天实时
环球热消息:聊聊分布式事务一致性与本地消息表
西门豹人物简介卡_西门豹人物简介
豹子闯入印度男子家中偷狗 狗主人惊醒淡定玩手机 网友:心真大
无限复制没了?《塞尔达传说:王国之泪》1.1.1更新发布:修复主线任务Bug_天天新动态
前高管唱衰:苹果MR设备将是史上最糟糕的产品之一 天天观天下
当前播报:裁员超千人后 长安福特又被曝裁减百万产能
曾致两死一伤!台州特斯拉事故歪曲事实视频作者致歉 全球独家
斗罗大陆剧场版最终预告公布,海神大战天使神,还有专属主题曲
通讯!软件工程快速入门
每日资讯:技术干货|如何利用 ChunJun 实现数据离线同步?
快看:腾讯云的devops自动化部署代替jenkins
双检锁(DCL)实现懒汉单例模式_全球讯息
网传云南一公园有多人用针扎小象,园方回应:已反馈了该情况,有关部门在协助调查
1199元起 雷蛇天狼星V2专业版游戏音箱发布:背投式RGB|当前最新
多芬广告呼吁女性游戏角色不必性感 宣传女性身材自信 引玩家众怒|世界热头条
openai为chatgpt人工智能推出ios应用
兑现“十年合约”:微软正式开启与NVIDIA合作
菜鸟CEO万霖发全员信:开启新创业征程 建设全球领先数智物流集团-天天热门
一机搞定全屋清洁!石头智能洗地机A10 Ultra图赏
日本4月份贸易赤字4324亿日元 信息
JS函数中的属性-全球简讯
【天天速看料】ET介绍——事件机制EventSystem
聊聊Sentinel的熔断降级
速讯:30多万买豪华行政车 新一代凯迪拉克CT6内饰官图:超帅9k曲面屏上车
《王者荣耀》520亚瑟新皮肤太过250:开局一条狗 玩家直呼要买
马克思主义理论专业大学排名(马克思主义专业大学排名及分数线)_世界最新
ChatGPT正式登陆iOS!但苹果却禁止员工使用-当前快报
科普:相机镜头的“放大倍率”是什么?
真我GT Neo5 SE“圣白幻影”配色亮相:颜值质感拉满|全球热推荐
项目管理快速入门
实时:聊聊Mybatis集成Spring的原理
SSM整合使用 天天信息
观速讯丨南微医学:5月18日融资买入1167.84万元,融资融券余额2.55亿元
华为凌霄子母路由Q6E开启预售:499元 每个房间都Wi-Fi满格
电动车价格战还打不打?电池级碳酸锂翻倍式触底反弹 重返30万元/吨 当前聚焦
网传云南一公园多人用针扎小象引围观 官方回应:网友呼吁不要再看动物表演
好消息!罗马后卫切利克赛后表示:我很好,伤势并不严重
JMeter性能测试工具快速入门教程
【读财报】4月猪价微降 上市猪企销量、收入环比变动较小
手机PC秒变16TB!华为家庭存储新款发布:再不怕断电了|焦点热议
当前热点-7.2万元 大疆发布Matrice 350 RTK旗舰无人机:升级20公里图传
算力达国际主流!飞腾国产服务器CPU腾云S2500被国家博物馆收藏 聚焦
接下来三十年还会继续快速贬值吗?-热点在线
学系统集成项目管理工程师(中项)系列22c_信息化知识(下)_环球即时看
重磅!ChatGPT正式发布App iOS客户端可下载
环球聚焦:Epic大特卖开启!7.5折套娃优惠券来了 超多大作打骨折
莒南县应急管理局全面部署五一期间应急值守工作
每日精选:ET介绍——C#更好的协程
全球快看:01-module/分频器/激励写法
全球动态:DDR2 学习笔记(一)
全球今日报丨女子帮摔倒老人反被指认为肇事者:本人正能量回应获网友点赞
今年夏天逃不掉高温了:全球平均气温正在波动上升 全球今头条
今亮点!员工回怼加班遭光速开除!公司回应:矛盾来源并不是加不加班
环球热门:跟苹果不一样!说到生产力 华为才是真正懂中国人的