webSocket的使用

2023-11-18

在Spring Boot项目中使用Java WebSocket

  1. 添加依赖:在项目的构建文件(如pom.xml)中添加Java WebSocket的依赖项。可以使用Java EE的WebSocket API或者其他第三方库,例如 Tyrus 或 Jetty WebSocket。

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-websocket</artifactId>
    </dependency>
    
  2. 创建WebSocket端点:创建一个类作为WebSocket端点,用于处理WebSocket连接和消息。这个类需要使用 @ServerEndpoint 注解进行标记,并定义相应的处理方法。

    @Component
    @ServerEndpoint("/ws/{token}")
    public class WebSocketServer {
        private static final Logger LOG = LoggerFactory.getLogger(WebSocketServer.class);
    
        /**
         * 每个客户端一个token
         */
        private String token = "";
    
        private static final HashMap<String, Session> map = new HashMap<>();
    
        /**
         * 连接成功
         */
        @OnOpen
        public void onOpen(Session session, @PathParam("token") String token) {
            map.put(token, session);
            this.token = token;
            LOG.info("有新连接:token:{},session id:{},当前连接数:{}", token, session.getId(), map.size());
        }
    
        /**
         * 连接关闭
         */
        @OnClose
        public void onClose(Session session) {
            map.remove(this.token);
            LOG.info("连接关闭,token:{},session id:{}!当前连接数:{}", this.token, session.getId(), map.size());
        }
    
        /**
         * 收到消息
         */
        @OnMessage
        public void onMessage(String message, Session session) {
            LOG.info("收到消息:{},内容:{}", token, message);
        }
    
        /**
         * 连接错误
         */
        @OnError
        public void onError(Session session, Throwable error) {
            LOG.error("发生错误", error);
        }
    
        /**
         * 群发消息
         */
        public void sendInfo(String message) {
            for (String token : map.keySet()) {
                Session session = map.get(token);
                try {
                    session.getBasicRemote().sendText(message);
                } catch (IOException e) {
                    LOG.error("推送消息失败:{},内容:{}", token, message);
                }
                LOG.info("推送消息:{},内容:{}", token, message);
            }
        }
    
    }
    

    在上面的示例中,使用 @ServerEndpoint("/websocket") 注解标记了WebSocket端点的URL路径。

  3. 配置WebSocket支持:在Spring Boot应用程序的配置类中,启用WebSocket支持。可以使用@EnableWebSocket 注解或者配置WebSocketConfigurer来完成。

    @Configuration
    public class WebSocketConfig {
        // ServerEndpointExporter作为一个Bean注册到Spring容器中,它会自动扫描并注册带有@ServerEndpoint注解的WebSocket端点类。
        @Bean
        public ServerEndpointExporter serverEndpointExporter() {
            return new ServerEndpointExporter();
        }
    
    }
    

    这个配置类可以用于将WebSocket端点类自动注册到Spring容器中,而无需手动配置和注册每个WebSocket端点。

  4. 运行应用程序:启动你的Spring Boot应用程序,WebSocket端点将会被注册,并可用于处理WebSocket连接和消息。

  5. 调用服务方

    public void vote(Long id) {
        docMapperCust.increaseVoteCount(id);
        String key = RequestContext.getRemoteAddr();
        //id+远程ip作为key和value,24小时的有效期
        if (redisUtil.validateRepeat("DOC_VOTE" + id + "_" + key, 3600 * 24)) {
            docMapperCust.increaseViewCount(id);
        } else {
            throw new BusinessException(BusinessExceptionCode.VOTE_REPEAT);
        }
    
        //推送消息
        Doc docDb = docMapper.selectByPrimaryKey(id);
        String logId = MDC.get("LOG_ID");
        wsService.sendInfo("【" + docDb.getName() + "】被点赞", logId);
    }
    
    
    
    @Service
    public class WsService {
    
        @Resource
        public WebSocketServer webSocketServer;
    	
        // 异步调用
        @Async
        public void sendInfo(String message, String logId) {
            MDC.put("LOG_ID", logId);
            webSocketServer.sendInfo(message);
        }
    }
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

webSocket的使用 的相关文章

随机推荐

  • springCloud-系统学习3- 创建微服务工程2

    2 11 Feign应用 是对下面代码的优化 自动根据参数拼接http请求地址 2 11 1 操作 效果 2 12 Feign负载均衡及熔断 Feign集成了ribbon配置项和Hystrix熔断的Fallback配置项 可以使用Feign
  • 基于ARM编译安装docker-harbor

    基于ARM编译安装docker harbor 一 编译内核 此举是为了保证redis镜像可以正常启动 1 安装依赖 yum y install gcc bc gcc c ncurses ncurses devel cmake elfutil
  • Python3 类型转换

    INT 支持转换为INT类型的 仅有 float str bytes 其他类型均不支持 float gt int 会去掉小数点及后面的数值 仅保留整数部分 int 12 94 12 str gt int 如果字符串中有数字 0 9 和正负号
  • 将yyyy-MM-dd hh:mm:ss转化为yyyy-MM-dd

    Date currentTime new Date SimpleDateFormat formatter new SimpleDateFormat yyyy MM dd Date strtodate String datas try str
  • Java异常和处理机制

    棒棒有言 追逐梦想的过程就像是一个人在走一条黑暗 幽深而又漫长的隧道 多少次跌倒又爬起 经历了多少个暗无天日的黑夜与白天 一路上沉淀着难以计数的汗水与泪水 不断地自我暗示 只要自己坚持 只要勇敢地一向往前走 就必须能找到出口 必须会看到光明
  • 读书笔记 摘自:《思维导图攻略:快速上手与落地实践》

    思维导图攻略 快速上手与落地实践 王健文 出版 2019 01 01 7 3万字 内容提要 无落地 不导图 思维导图的学习并不在于思维导图的绘制本身 而是在于实际应用和思维提升 第一章 精英人士自我提升的思维利器 第一节 提升大脑学习力的秘
  • 广州华锐互动:利用VR复原文化遗址,沉浸式体验历史文物古迹的魅力

    在过去的几十年里 科技发展飞速 为我们打开了无数新的视角和可能性 其中 虚拟现实 Virtual Reality 简称VR 技术的崭新应用 为我们提供了一种全新的 近乎身临其境的体验历史的方式 本文将重点探讨VR技术在复原历史古迹方面的应用
  • How to use tar command to complete file compression and decompression in Ubuntu

    TAR 1 GNU TAR Manual TAR 1 NAME tar an archiving utility SYNOPSIS Traditional usage tar A
  • beam search的例子

    看了一下网上对beam search的讲解 感觉都说的太杂了 我试图用一个最简单的例子来帮助读者理解 见下图 假设我有一个模型 能够根据当前词输出下一个词的概率分布 最后依次这样就能生成一大串文本 以上面的图为例 The 的下一个词的最大概
  • Spring StateMachine使用笔记

    Spring StateMachine使用笔记 配置状态机 状态 分层状态 withStates 配置状态 states状态列表 可以使用多个withStates进行parent分层 配置区域 当相同的分层状态机具有多组状态时 每个都具有初
  • 系统移植开发阶段部署

    开发阶段部署阶段 uboot镜像 ubootpak bin flash SD linux内核镜像 uImage tftp下载 根文件系统 rootfs nfs挂载 本文操作需要用到uboot命令进行镜像搬移和根文件系统挂载 uboot中常用
  • EPS学习笔记3----------常用地物采集方法(房屋,斜坡,台阶)

    1 三维模型中房屋绘制方法 面状地物 五点房 不会自动弹出房屋属性录入窗口 任意绘制法 绘制结束弹出房屋属性录入窗口 多点法 1 首先在房屋某一面用鼠标左键选择一点 2 鼠标移到房屋屋檐处 利用shift A将前一节点高程移到屋檐高程 3
  • 前端开发常见面试题第三篇(Vue和React)

    文章目录 1 Vue中直接获取组件内的DOM元素或子组件实例 2 生命周期 3 双向绑定原理 4 v if和v show的区别 5 Vue导航钩子 6 路由跳转的方式 7 vuex常用的是什么 怎么使用 8 父子组件之间通信 9 跨域处理
  • Java排序算法:选择排序

    Java排序算法 选择排序 选择排序它的主要思想是 在未排序的数组中选择最小的元素 然后将其放置在数组的起始位置 再在剩余的未排序数组中选择最小元素 并将其放置在已排序部分的末尾 重复此过程 直到整个数组排序完成 选择排序的步骤如下 1 从
  • 15款业界公认的最佳视频处理软件

    因为需要购买昂贵的视频处理软件和高性能图形计算机 所以视频处理是一项比较耗费金钱的技术活 正是由于这样 一部分人选择使用性能较好的免费在线编辑软件 无需太多视频处理知识便可在浏览器中剪切和编辑视频 然而 当我们无法连接网络或网络很慢的时候
  • IC卡片使用基础

    一 卡片基本概念 集成电路卡 即日常生活中常使用的卡片 可以根据读写特性分为两类 ID卡和IC卡 ID卡 全称身份识别卡 是一种不可写入的感应卡 含固定编号 卡内除了卡号外 无任何保密功能 其 卡号 是公开 裸漏的 IC卡 带有存储器 又称
  • redis缓存击穿、缓存穿透、缓存雪崩、缓存一致性解决方案的代码实现

    1 0 缓存击穿 概念 一些redis的key过期 同时大量数据请求过期的key或者redis不存在的key 导致大量请求打到数据库 导致数据库瘫痪 解决方案 1 设置热点数据永不过期 2 对热点数据加锁 分布式锁 代码实现 初始化项目 商
  • 【笔记】有点麻烦的MatConvNet的dagnn的debug过程

    尝试用MatConvNet训练 然而遇到了以下bug 一脸懵逼折腾了四天 No public property dilate exists for class dagnn Conv Error in dagnn Layer load lin
  • javaweb课程设计之商品后台管理系统

    主要技术 layui框架 html5 jsp oracle数据库 servlet session filter 功能说明 基于java开发的商品管理系统 管理员在后台进行添加商品 修改商品 删除商品 批量删除商品 设置商品上下架功能等 完美
  • webSocket的使用

    在Spring Boot项目中使用Java WebSocket 添加依赖 在项目的构建文件 如pom xml 中添加Java WebSocket的依赖项 可以使用Java EE的WebSocket API或者其他第三方库 例如 Tyrus