当前位置: 首页 > news >正文

springboot对接WebSocket实现消息推送

1.修改pom文件

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

2.增加配置WebSocketConfig.java

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;@Configuration
public class WebSocketConfig {@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}}

3.创建一个WebSocket实例


import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.concurrent.ConcurrentHashMap;@Slf4j
@ServerEndpoint(value = "/websocket/{name}")
@Component
public class WebSocket {/***  与某个客户端的连接对话,需要通过它来给客户端发送消息*/private Session session;/*** 标识当前连接客户端的用户名*/private String name;/***  用于存所有的连接服务的客户端,这个对象存储是安全的*/private static ConcurrentHashMap<String,WebSocket> webSocketSet = new ConcurrentHashMap<>();@OnOpenpublic void OnOpen(Session session, @PathParam(value = "name") String name){this.session = session;this.name = name;// name是用来表示唯一客户端,如果需要指定发送,需要指定发送通过name来区分webSocketSet.put(name,this);log.info("[WebSocket] 连接成功,当前连接人数为:={}",webSocketSet.size());}@OnClosepublic void OnClose(){webSocketSet.remove(this.name);log.info("[WebSocket] 退出成功,当前连接人数为:={}",webSocketSet.size());}@OnMessagepublic void OnMessage(String message, @PathParam("name") String name){log.info("[WebSocket] 收到消息:{}",message);appointSending(name,message);}/*** 群发* @param message*/public void groupSending(String message){for (String name : webSocketSet.keySet()){try {webSocketSet.get(name).session.getBasicRemote().sendText(message);}catch (Exception e){e.printStackTrace();}}}/*** 指定发送* @param name* @param message*/public void appointSending(String name,String message){try {WebSocket webSocket = webSocketSet.get(name);if(null != webSocket) {webSocket.session.getBasicRemote().sendText(message);}}catch (Exception e){e.printStackTrace();}}}

4.修改启动类,添加注解

@EnableWebSocket

5.测试一下推送消息

Websocket在线测试-Websocket接口测试-Websocket模拟请求工具

浏览器端发送消息

服务端收到信息

6.前端对接WebSocket

    var websocket = null;if('WebSocket' in window){websocket = new WebSocket("ws://127.0.0.1:6893/websocket/1");}websocket.onopen = function(){console.log("连接成功");}websocket.onclose = function(){console.log("退出连接");}websocket.onmessage = function (event){console.log(getTime() + "收到消息: "+event.data);// playMp3();// handleSpeak(event.data);}websocket.onerror = function(){console.log("连接出错");}window.onbeforeunload = function () {websocket.close(num);}const getTime= () => {const time = new Date();const year = time.getFullYear();const month = ('0' + (time.getMonth() + 1)).slice(-2);const day = ('0' + time.getDate()).slice(-2);const hours = ('0' + time.getHours()).slice(-2);const minutes = ('0' + time.getMinutes()).slice(-2);const seconds = ('0' + time.getSeconds()).slice(-2);const now = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;return now;}

7.增加消息推送语音播放_文本转语音

     const synth = window.speechSynthesis; // 启用文本const msg = new SpeechSynthesisUtterance(); // 表示一次发音请求。其中包含了将由语音服务朗读的内容,以及如何朗读它(例如:语种、音高、音量)。// 语音播报的函数const handleSpeak=(text)=> {msg.text = text; // 文字内容: 测试内容msg.lang = "zh-CN"; // 使用的语言:中文msg.volume = 100; // 声音音量:1msg.rate = 1; // 语速:1msg.pitch = 100; // 音高:1synth.speak(msg); // 播放}; // 语音停止const  handleStop=(e)=>  {msg.text = e;msg.lang = "zh-CN";synth.cancel(msg); // 取消该次语音播放};  
handleSpeak("测试内容");

或者播放指定的音频文件,播放音频需要浏览器设置可以发放声音

const playMp3 = () => {let mp3 = new Audio('音频地址') // 创建音频对象mp3.loop = false;mp3.play() // 播放}

8.如何修改成wss请求

项目上线需要https请求,把请求地址换成wss,需要通过nginx配置转发,再443端口加上如下配置

location /wss/ {proxy_pass http://127.0.0.1:6893/;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "Upgrade";proxy_read_timeout 18000s;proxy_connect_timeout 18000s;proxy_send_timeout 18000s;}

请求地址更换成wss://域名/wss/websocket/

相关文章:

  • SpringBoot 3 集成Hive 3
  • 第十五节TypeScript 接口
  • 【MySQL】:超详细MySQL完整安装和配置教程
  • 【网络编程】基于UDP数据报实现回显服务器程序
  • 沉浸式go-cache源码阅读!
  • pytest 的 fixture 固件机制
  • 竞赛保研 基于RSSI的室内wifi定位系统
  • STM32软硬件CRC测速对比
  • Django之按钮(actions)
  • Linux服务器 部署飞书信息发送服务
  • 信息系统定级与等级测评的具体过程
  • 测试C#使用AForge从摄像头获取图片
  • 轮廓平滑方法
  • 怎么使用5118站长工具API接口处理采集数据
  • 设计模式之-命令模式,快速掌握命令模式,通俗易懂的讲解命令模式以及它的使用场景
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 【css3】浏览器内核及其兼容性
  • C# 免费离线人脸识别 2.0 Demo
  • ES6之路之模块详解
  • Linux CTF 逆向入门
  • Vue.js-Day01
  • Vue2.x学习三:事件处理生命周期钩子
  • Webpack 4x 之路 ( 四 )
  • 翻译:Hystrix - How To Use
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 京东美团研发面经
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 力扣(LeetCode)357
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 入门级的git使用指北
  • 深度解析利用ES6进行Promise封装总结
  • 新手搭建网站的主要流程
  • 在Unity中实现一个简单的消息管理器
  • 中文输入法与React文本输入框的问题与解决方案
  • 自制字幕遮挡器
  • 阿里云服务器如何修改远程端口?
  • ​如何在iOS手机上查看应用日志
  • ​什么是bug?bug的源头在哪里?
  • # 达梦数据库知识点
  • #13 yum、编译安装与sed命令的使用
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • (26)4.7 字符函数和字符串函数
  • (day6) 319. 灯泡开关
  • (差分)胡桃爱原石
  • (二)构建dubbo分布式平台-平台功能导图
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (十八)SpringBoot之发送QQ邮件
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (转)视频码率,帧率和分辨率的联系与区别
  • (转)树状数组
  • (转载)Linux 多线程条件变量同步
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料