WebSocket整合spring 一文全部搞定

2023-11-08

文章声明

本文简单整合了webSocket 组件,涉及到的源码分解,原理什么的以后再说,本文只适合入门小白体验,不涉及复杂业务逻辑。

1 引入webSocket依赖包

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

2 声明式整合WebSocket(这是一道硬菜)

spring 给WebSocket整合提供了一套比较简单的声明式注解完成开发任务。

2.1 webSocket 配置类
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

@EnableWebSocket
@Configuration
public class WebSocketConfig {

    @Bean
    public ServerEndpointExporter serverEndpointExporter(){
        return new ServerEndpointExporter();
    }
}

将此ServerEndpointExporter Bean对象注入到springBean 容器中,作用是检测带有@ServerEndpoint注释的Bean对象,并进行注册。

2.2 websocket 业务处理的主体部分

服务器通过webSocket 推送给客户端的消息就再次类中处理,本文的主体部分

import com.ruoyi.common.annotation.Anonymous;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpSession;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;

@Slf4j
@Component
@ServerEndpoint(value = "/ws/")
public class SocketController {

    private Session session;// 当前连接会话的客户端

	// 存放连接会话的全部客户端
    private static final CopyOnWriteArraySet<WarningSocketController> webSocketServers=new CopyOnWriteArraySet<>();

    @OnMessage
    public void onMessage(String message,Session session){
//        log.info("接收客户端的消息:{}",message);
    }

//获取连接的客户端信息
    @OnOpen
    public void onOpen(Session session, EndpointConfig config){
        webSocketServers.add(this);
        this.session=session;
    }

// 关闭连接
    @OnClose
    public void onClose(Session session, CloseReason closeReason){
        webSocketServers.remove(this);

    }
// 连接报错
    @OnError
    public void onError(Session session,Throwable throwable){
        throwable.printStackTrace();
        log.error("服务已断开");
    }

    /**
     * 实现服务器主动推送
     */
    public void sendMessage(String message) throws IOException {
    	// 给当前客户端推送消息
        this.session.getBasicRemote().sendText(message);
    }

    /**
     * 群发消息
     */
    public static void sendInfo(String message) {
        for (SocketController item : webSocketServers) {
            item.session.getAsyncRemote().sendText(message);
        }
    }
}

下面我就详细的讲一下各个注解的作用,和注解下的方法为什么参数这么写,都是有原因的。

第一个问题:private Session session;这个变量这么定义的含义是什么?
回答: 获取连接服务器的当前客户端。

第二个问题: private static final CopyOnWriteArraySet<WarningSocketController> webSocketServers=new CopyOnWriteArraySet<>(); 为什么缓存所有连接到本服务器的客户端?
**回答:**主要为了给全部客户端推送消息用。

测试

截止到目前,webSocket 服务端已经搭建完毕,可以测试了,基本格式ws://IP:port/,在线测试网站http://wstool.js.org/,我写的Demo测试样例:在这里插入图片描述,按照这个格式来。端口号,按照你的服务来。

3 客户端连接

本文封装了socket.js文件,提供了websocket连接,心跳,接收服务器消息等功能。

class WebSocketService {
  constructor(url) {
    this.url = url
    this.websocket = null
    this.reconnectInterval = 5000 // 重连间隔时间
    this.heartBeatInterval = 3000 // 心跳间隔时间
    this.heartBeatTimer = null
    this.connect()
  }

  websocket=null;


  connect() {
    this.websocket = new WebSocket(this.url)
    this.websocket.onopen = () => {
      console.log("WebSocket connected")
      this.startHeartBeat()
    }

    this.websocket.onclose = () => {
      console.log("WebSocket disconnected")
      this.stopHeartBeat()
      setTimeout( () => {
        console.log("WebSocket reconnecting…")
        this.connect()
      },this.reconnectInterval)
    }
    this.websocket.onerror = (error) => {
      console.log("WebSocket error:", error)
      this.websocket.close()
    }
    return this.websocket;
  }

   getMessage(fun){
    this.websocket.onmessage=function(message) {
      if(fun){
        fun(message.data);
      }
    }
  }

  startHeartBeat() {
    this.heartBeatTimer = setInterval ( () => {
      if(this.websocket.readyState === WebSocket.OPEN) {
        this.websocket.send("websocket  ping heartBeat")
      }
    }, this.heartBeatInterval)
  }

  stopHeartBeat() {
    clearInterval(this.heartBeatTimer)
  }
}

export default WebSocketService

4 客户端连接测试用例

// 初始化连接websocket
    initWebSocket(){
      this.warningSocket = new WebSocketService("ws://127.0.0.1:80/ws");
      this.warningSocket.connect();
      this.Message();
    },
    // 接收服务器推送的消息
    Message(){
      this.warningSocket.getMessage((data)=>{
        let row = JSON.parse(data)
        console.log(row)
      });
    }

浏览器打印在这里插入图片描述说明已经连接成功了。

关于WebSocket ip地址用域名替换,出现连接不上的问题

问题是域名在nginx配置的时候,并没有把websocket映射路径配置到nginx上,通过域名访问不到websocket 。

  location /ws {
                proxy_pass  http://155.255.255:80/ws; // 配置服务器IP地址,通过/ws转发访问到配置路径中。首先保证通过映射的服务器地址能够访问到websocket 不确定可以通过上面的网站测试
                proxy_set_header Host $host;
                proxy_set_header Upgrade 'websocket';
                proxy_set_header Connection 'Upgrade';
        }

测试用例:测试通过服务器访问websocket 在这里插入图片描述。全文终止,有时间在完善。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WebSocket整合spring 一文全部搞定 的相关文章

随机推荐

  • 10.MATLAB方差分析

    更多MATLAB数据分析视频请点击 或者在网易云课堂上搜索 MATLAB数据分析与统计 http study 163 com course courseMain htm courseId 1003615016 方差分析是英国统计学家R A
  • 推荐模块丨前端uniapp微信小程序项目

    小兔鲜儿 推荐模块 主要实现 Tabs 交互 多 Tabs 列表分页加载数据 动态获取数据 参考效果 推荐模块的布局结构是相同的 因此我们可以复用相同的页面及交互 只是所展示的数据不同 外链图片转存失败 源站可能有防盗链机制 建议将图片保存
  • 2021.11.01 c++下 opencv部署yolov5-6.0版本 (四)

    0 写在最前 2022 10 10 更新yolov5 seg实例分割模型 2022 09 29更新 c 下面使用opencv部署yolov5和yolov7实例分割模型 六 爱晚乏客游的博客 CSDN博客 2022 07 25 更新了下yol
  • [JAVAee]IP数据包的组包与分包

    目录 数据包是什么 数据包的结构 数据包 分组与分组交换 分包是什么 为什么需要分包呢 组包是什么 分包组包过程中和哪些 IP 报头字段有关联 本篇文章主要围绕三个问题来展开 为什么要分包 分包组包过程中和哪些 IP 报头字段有关联 组包时
  • matlab怎么显示当前文件夹和工作区

    参考 matlab怎么显示当前文件夹和工作区 云 社区 腾讯云 1 第一步在我们的电脑上打开matlab 可以看到界面上目前没有显示当前文件夹和工作区 如下图所示 2 第二步我们点击主页右侧的布局 可以看到显示下的当前文件夹和工作区没有勾选
  • 遗传算法入门到掌握(一)

    遗传算法入门到掌握 一 心得 把解决方案做染色体 遗传算法的有趣应用很多 诸如寻路问题 8数码问题 囚犯困境 动作控制 找圆心问题 这是一个国外网友的建议 在一个不规则的多边形 中 寻找一个包含在该多边形内的最大圆圈的圆心 TSP问题 在以
  • node.js HTTP模块 URL模块 supervisor工具

    在vscode 上安装一个插件 Node Snippets 创建一个js文件 直接输入node 就能创建一个服务器 node http server var http require http 表示引入一个HTTP模块 request 表示
  • Texture Format全解析

    Texture Format全解析 Texture Format全解析 What internal representation is used for the texture This is a tradeoff between size
  • sqlmap的安装及使用教程

    1 sqlmap简介 sqlmap 是一个开源渗透测试工具 可自动检测和利用 SQL 注入缺陷并接管数据库服务器 支持多种数据库和多种注入技术 2 sqlmap安装 sqlmap是基于python环境的 因此安装前需要安装python环境
  • Vue + element中table来回切换页面显示差异问题

    这次做项目遇到多个table切换页面显示差异的问题 当我切换到上个页面的时候 表格有一列是下个页面的内容 切换到下个页面的时候那一列的内容消失了 就很奇葩 这个问题也是我都一次遇到 问了Baidu阿姨 上面的解决办法好像都不行 这个时候感觉
  • esxi能直通的显卡型号_虚拟黑群也可以NVMe加速?还能万兆?wa!

    之前我发了三篇关于FreeBSD虚拟机安装黑群晖的文章 没有阅读的同学可以看一下 钱乎 如何拥有一台100T容量的NAS Let s do it zhuanlan zhihu com 钱乎 100TB的NAS之后续填坑 虚拟硬件篇 zhua
  • Gradle sync failed: Sync failed: reason unknown

    android项目复制后打开总是报这个错误 打开build查看红色错误提示 比如提示缺少android 23 打开file gt setting 展开后把对应的SDK勾选上再ok
  • 2021计算机考硕复试线,2021考研复试线汇总:国家线+34所中5所院校复试线①

    原标题 2021考研复试线汇总 国家线 34所中5所院校复试线 突如其来 昨天晚上 中国教育发布 公布了2021年硕士研究生考试学术学位类和专业学位类的国家线 随后 34中的5所院校也更新了2021年复试线成绩 包含以下这5所院校 清华大学
  • vue项目Error: Cannot find module ‘xxx’类报错的解决方法

    现发现只要是报错 Error Cannot find module xxx 例如 Error Cannot find module webpack 这类的问题都可以用下面的方法解决 报错内容如下 运行 npm install 没问题 运行
  • 消息队列的两种模式

    Java消息服务 Java Message Service JMS 应用程序接口是一个Java平台中关于面向消息中间件 MOM 的API 用于在两个应用程序之间 或分布式系统中发送消息 进行异步通信 点对点与发布订阅最初是由JMS定义的 这
  • Box2D C++ 教程-物体

    Box2D C 教程 物体 物体 Bodies 物体是物理场景中的基本对象 但是这里的物体并不是你看到的实际互相弹跳碰撞的实物 听起来很费解吗 挺住 马上做解释 http ohcoder com blog 2012 11 29 bodies
  • springboot+log4j2遇到的坑

    情景再现 按照网上一般的教程 这样 并添加 去除 common logging的jar 实际过程中 仍然报错会发出警告 大概意思如下 slfj仍然用着springboot默认的logback 包有冲突 所以第一图并没有起作用 而且logba
  • 【20200326】数据挖掘课程课业打卡三

    20200326 数据挖掘课业打卡三之数据质量 数据挖掘课业打卡三之数据质量 一 单选题 二 填空题 三 判断题 知识点汇总 1 数据中可能存在的问题 2 数据预处理方法 3 关于欧几里得距离 叮嘟 这里是小啊呜的学习课程资料整理 好记性不
  • the host '192.168.2.100'is unreachable,The host may be down,or there may be a problem with......解决办法

    我这里遇到这样的问题 是因为网关和网络IP没有配置对造成的 解决办法如下 第一步 打开VM 点中要操作的虚拟机 鼠标点击左上角 编辑 虚拟网络编辑器 如下图所示 第二步 若是选择自定义网关 即选择如上图的VMnet8模式 选中VMnet8
  • WebSocket整合spring 一文全部搞定

    文章声明 本文简单整合了webSocket 组件 涉及到的源码分解 原理什么的以后再说 本文只适合入门小白体验 不涉及复杂业务逻辑 文章目录 1 引入webSocket依赖包 2 声明式整合WebSocket 这是一道硬菜 2 1 webS