springBoot整合websocket_AnswerCoder的博客-程序员秘密

技术标签: spring boot  1024程序员节  websocket  java框架学习  

编写代码

maven pom文件引入websocket依赖

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

websocket配置类
如果不使用spring内置的tomcat,则无需配置此类

@Configuration
public class WebSocketConfig {
    
    /**
     * 支持websocket
     * 如果不使用内置tomcat,则无需配置
     * @return
     */
    @Bean
    public ServerEndpointExporter serverEndpointExporter(){
    
        return new ServerEndpointExporter();
    }
}

websocketServer

@Slf4j
@Component
@ServerEndpoint(value = "/myWebSocket")
public class MyWebSocketServer {
    

    //用来存放每个客户端对应的MyWebSocket对象
    private static CopyOnWriteArraySet<MyWebSocketServer> user = new CopyOnWriteArraySet<MyWebSocketServer>();
    //与某个客户端的连接会话,需要通过它来给客户端发送数据
    private Session session;

    @OnOpen
    public void onOpen(Session session){
    
        this.session = session;
        user.add(this);
        log.info("websocket-用户 {} 连接",this.session.getId());
    }
    @OnClose
    public void onClose(){
    
        user.remove(this);
        log.info("websocket-用户 {} 关闭连接",this.session.getId());
    }

    /**
     * 收到客户端消息后调用的方法
     * @param message 客户端发送的消息
     * @param session 连接
     */
    @OnMessage
    public void onMessage(String message,Session session){
    
        log.info("websocket-收到了客户端消息: {}",message);
    }

    @OnError
    public void onError(Session session,Throwable error){
    
        error.printStackTrace();
        log.info("websocket-用户 {} 连接错误 : {}",this.session.getId(),error.toString());
    }

    //发送消息
    public void sendMessage(String message) {
    
        //遍历储存的Websocket
        for (MyWebSocketServer webSocket : user) {
    
            //发送
            try {
    
                webSocket.session.getBasicRemote().sendText(message);
            } catch (Exception e) {
    
                e.printStackTrace();
            }
        }
    }
}

controller层调用websockerServer

	@ApiOperation("添加备注")
    @PostMapping("/remark")
    @ResponseBody
    public CommonResult remarkCounsel(@RequestBody @Validated SolveOrRemarkCounselDto remarkCounselDto){
    
        opLogService.remarkCounsel(remarkCounselDto);
        webSocketServer.sendMessage("有新的备注!");
        return CommonResult.success(null,"备注提交成功!");
    }

js代码

let websocket = null;
if ('WebSocket' in window){
    
  websocket = new WebSocket("ws://"+ window.location.host +"/iqas-dev-zyp/myWebSocket")
}else {
    
  $.alert('当前浏览器不支持websocket')
}
//接收到消息的回调方法
websocket.onmessage = function (event) {
    
  console.log(event.data);
  //这里写接受到消息后前端的方法逻辑...
}
//连接成功建立的回调方法
websocket.onopen = function () {
    
  console.log("websocket onopen...");
}
//连接关闭的回调方法
websocket.onclose = function () {
    
  console.log("websocket onclose...");
}
//连接发生错误的回调方法
websocket.onerror = function () {
    
  console.log("websocket connect error...");
  $.alert("websocket connect error...");
};
//监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
window.onbeforeunload = function () {
    
  closeWebSocket();
}
//关闭WebSocket连接
function closeWebSocket() {
    
  websocket.close();
}

实现效果

当用户添加备注时,controller层会调用service将用户备注的信息存入数据库中,同时通知websocketServer有新的备注信息,之后前端请求数据库将备注信息展示在页面,实现当前在该页面的用户可以即时看到其他用户添加的备注。

遇到的问题

外网无法连接到websocket,解决方案参考:
https://www.hi-linux.com/posts/42176.html

参考资料

https://www.jianshu.com/p/6f15e25bbb62
https://blog.csdn.net/weixin_42364319/article/details/104274029

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_40932102/article/details/120543402

智能推荐

Python 帮你批量生成手机号码_程序员大咖的博客-程序员秘密

Python实战社群Java实战社群长按识别下方二维码,按需求添加扫码关注添加客服进Python社群▲扫码关注添加客服进Java社群▲作者丨星安果来源丨AirPython1目 标 场...

深度学习之opencv的基础应用总结_opencv的应用_kanna小石头的博客-程序员秘密

cv2库是是强大的图形处理库,在自己一边学习的同时希望通过这样的方式方便大家也在码代码的过程中对自己更好的掌握这些知识。一、cv2 的安装这里直接安装opencv-python包(非官方): pip install opencv-python二、图像的读取和写入(1)imread(img_path,flag) 读取图片,返回图片对象参数解释:img_path:图片的路径,注意,路径中慎用中文名flag:cv2.IMREAD_COLOR, 读取彩色图片,为默认参数cv2.IMREA

零基础移动端APP设计与开发教程_stml菜鸟教程_cuicuiniu521的博客-程序员秘密

App开发本质上涉及到多方面的知识:html css js java php mysql.......;从底层技术开始学周期太长,并不适用,特别是对于非计算机出生的同学。本课程的目的希望能够在选择合适的开发工具的基础上,自顶向下进行学习,以尽早实现app案例开发为目标,先入门然后进行更深入的学习。当前app开发的趋势:无代码开发与低代码开发无代码开发的代表:ivx,氚云,简道云,牛刀......2021盘点:国内外10大低代码开发平台,哪个更值得一试? - 少数派低代码开发:国内工具:APICl

【论文整理】NAACL2019+AAAI2019文本分类论文摘要_zenRRan的博客-程序员秘密

点击上方,选择星标或置顶,每天给你送干货!阅读大概需要11分钟跟随小博主,每天进步一丢丢作者:choose_c编辑:zenRRan链接:https://blog.csdn.net/cho...

R语言基础教程2:散点图_r 散点图拟合曲线后如何隐藏散点_金子哦的博客-程序员秘密

R语言基础教程1:数据类型R语言基础教程2:散点图R语言基础教程3:曲线图、误差线和图例R语言基础教程4:柱形图R语言基础教程5:图形页面排版R语言基础教程6:程序设计基础R语言基础教程7:数据描述性统计先了解一个概念:函数。简单地说,把一些R语句(赋值、计算或其他操作步骤)包装起来并给它一个名称,这就是函数。我们前面接触过的getClass( ), class( ), head( ), rep(

Linux系统root用户登录后显示 “-bash-4.2#” 解决方案-程序员秘密

当我们像往常一样登录root用户的时候,发现不是熟悉的[[email protected] ~]# 而变成了 -bash-4.2遇到这种问题的原因是不小心删除了/root文件夹下的.bash_profile与 .bashrc两个文件,这里我们只需要将这两个文件还原即可,具体操作如下:1.查看/root目录下是否有文件缺失,这里使用命令ls -a,以显示隐藏文件:2.此时我们进入系统的用户模板目录下:cd /etc/skells -a如下图3.此时只需要将这两个文件复制到/root下即可:cp

随便推点

CSS 移动端PC端背景图全屏满屏显示_深漂小码哥的博客-程序员秘密

html:&lt;!DOCTYPE html&gt;&lt;head&gt;&lt;meta charset="utf-8"&gt;&lt;title&gt;&lt;/title&gt; &lt;meta name="renderer" content="webkit|ie-comp|ie-stand"&gt; &lt;meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"&gt; &lt;meta name="

代码数据集-20181208_齐思的博客-程序员秘密

一、数据集:新闻文档1.数据集清华NLP组提供的THUCNews新闻文本分类数据集的一个子集(原始的数据集大约74万篇文档,训练起来需要花较长的时间)。 Train(Test)\ 类别1\ 1.txt 2.txt 3.txt ... n.txt 类别2\ ... ...

[省选前题目整理][POJ 1830]开关问题(XOR方程组高斯消元)_【高斯消元】开关问题(poj1830)_qpswwww的博客-程序员秘密

题目链接http://poj.org/problem?id=1830思路很好的一道题。。。 对于nn个开关,我们可以很容易地列出nn个nn元一次方程,每个方程如下: a1x1⊕a2x2⊕a3x3...⊕anxn=ca_1x_1⊕a_2x_2⊕a_3x_3...⊕a_nx_n=c 其中每个a、x、ca、x、c均为0或1,xi=1x_i=1表示第ii个开关按下,xi=0x_i=0表示第ii个开关没

vscode 导入的三方库没有代码提示的问题_vscode读取不到python三方库_吃不胖的粥的博客-程序员秘密

发现在vscode里面 关于tensorflow的内容都不提示,需要一个字母一个字母的敲。搜索了一下解决方案:https://blog.csdn.net/weixin_34224941/article/details/86023757在tensorflow包下的__init__.py文件中定义了一个contrib变量表示tensorflow.contrib包下的内容,但是tensorflo...

探索5G - 5G 可能会带来哪些改变与变革_g具有解决物联网超什么连接的支持能力_简简单单OnlineZuozuo的博客-程序员秘密

文章目录探索5G - 5G 可能会带来哪些改变与变革1、5G 与 4G 的技术对比2、可感知的变化3、5G 主要倾向于解决的问题4、超高传输速率推动的物联网设备 IOT,无人驾驶技术5、交互形式的变更,实时 VR 技术6、5G 的一些限制和弊端探索5G - 5G 可能会带来哪些改变与变革关联阅读 探索5G - 回顾4G 给我们带来了哪些变化1、5G 与 4G 的技术对比5G 的传输频率比4G 更大带宽比4G 更大延迟比4G 更短但是最大的变化是传输路径的变化,不再需要向4G那样经过

推荐文章

热门文章

相关标签