WebSocket 使用方式,如何扩展比如统计消息数量

WebSocket实现后端数据变化,通知前端实时更新数据 数据实时更新,WebSocket通信,数据变化。 阅读详情

websocket

直接贴代码

package com.cf.mqtt.controller.socket;

import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArraySet;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;

import lombok.val;
import org.springframework.stereotype.Component;

import lombok.extern.slf4j.Slf4j;

@Component
@Slf4j
@ServerEndpoint("/websocket/{userId}")  
// 前端接口路径 ws://localhost:8080/webSocket/userId; 
public class WebSocket {

    //与某个客户端的连接会话,需要通过它来给客户端发送数据
    private Session session;
    /**
     * 用户ID
     */
    private String userId;

    //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
    //虽然@Component默认是单例模式的,但springboot还是会为每个websocket连接初始化一个bean,所以可以用一个静态set保存起来。
    //  注:底下WebSocket是当前类名
    private static CopyOnWriteArraySet<WebSocket> webSockets =new CopyOnWriteArraySet<>();
    // 用来存在线连接用户信息
    private static ConcurrentHashMap<String,Session> sessionPool = new ConcurrentHashMap<String,Session>();

    /**
     * 链接成功调用的方法
     */
    @OnOpen
    public void onOpen(Session session, @PathParam(value="userId")String userId) {
        boolean flag  = true;
        try {
			//同一用户尝试重新连接,保证
            for (WebSocket webSocket:webSockets) {
                if(webSocket.userId.equals(userId)) {
                    log.info("【websocket消息】当前连接+" + userId +  "+已存在,总数为:"+webSockets.size());
                    this.session = sessionPool.get(userId);
                    this.userId = userId;
                    flag = false;
                    break;
                }
            }
            if(flag){
                this.session = session;
                this.userId = userId;
                webSockets.add(this);
                sessionPool.put(userId, session);
            }
            log.info("【websocket消息】有新的连接,总数为:"+webSockets.size());
        } catch (Exception e) {
        }
    }

    /**
     * 链接关闭调用的方法
     */
    @OnClose
    public void onClose() {
        try {
            webSockets.remove(this);
            sessionPool.remove(this.userId);
            log.info("【websocket消息】连接断开,总数为:"+webSockets.size());
        } catch (Exception e) {
        }
    }

    /**
     * 用于服务端主动断开连接
     * @param userId
     */
    public void close(String userId) throws IOException {

        for (WebSocket webSocket:webSockets) {
           if(webSocket.userId.equals(userId)) {

               session = sessionPool.get(userId);
//               session.close();
               CloseReason.CloseCode closeCode = CloseReason.CloseCodes.getCloseCode(1000);
               CloseReason cr = new CloseReason(closeCode,"服务器主动剔除行为");
               session.close(cr);
               webSockets.remove(webSocket);
               sessionPool.remove(userId);
               log.info("【websocket消息】服务主动断开了UserId:"+userId);
               log.info("【websocket消息】连接断开,总数为:"+webSockets.size());
               break;
            }
        }
    }
    /**
     * 收到客户端消息后调用的方法
     *
     * @param message
     */
    private int cc = 0;
    @OnMessage
    public void onMessage(String message) {
        for (WebSocket webSocket:webSockets) {
            webSocket.cc ++;
        }

        log.info("【websocket消息】收到客户端消息:"+cc);
        log.info("【websocket消息】收到客户端消息:"+message);
    }

    /** 发送错误时的处理
     * @param session
     * @param error
     */
    @OnError
    public void onError(Session session, Throwable error) {

        log.error("用户错误,原因:"+error.getMessage());
        error.printStackTrace();
    }


    // 此为广播消息
    public void sendAllMessage(String message) {
        log.info("【websocket消息】广播消息:"+message);
        for(WebSocket webSocket : webSockets) {
            try {
                if(webSocket.session.isOpen()) {
                    webSocket.session.getAsyncRemote().sendText(message);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    // 此为单点消息
    public void sendOneMessage(String userId, String message) {
        Session session = sessionPool.get(userId);
        if (session != null&&session.isOpen()) {
            try {
                log.info("【websocket消息】 单点消息"+ userId +":"+message);
                session.getAsyncRemote().sendText(message);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    // 此为单点消息(多人)
    public void sendMoreMessage(String[] userIds, String message) {
        for(String userId:userIds) {
            Session session = sessionPool.get(userId);
            if (session != null&&session.isOpen()) {
                try {
                    log.info("【websocket消息】 单点消息"+ userId +":"+message);
                    session.getAsyncRemote().sendText(message);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

    }

}

WebSocket与MQTT选型实战:工业IoT实时通信避坑指南 实时数据传输是物联网系统的核心能力,其本质是解决端到端低延迟、高可靠的消息投递问题。WebSocket提供全双工TCP隧道,适合人机交互场景,但缺乏内置可靠性机制;MQTT则是面向发布/订阅的消息中间件,具备QoS分级、遗嘱消息、会话保持等工业级保障。技术价值在于匹配不同终端能力(如ESP32-S3资源受限)、网络环境(Wi-Fi/NB-IoT)与业务SLA(≤200ms延迟、≤0.001%丢包)。典型应用场景包括工厂设备状态监控、嵌入式音频流传输、Web前端实时看板。当需求中出现'esp32s3 max9 阅读详情

相关推荐

WebSocket高级通信模式

本文介绍了WebSocket消息协议的设计方案,主要内容包括: 消息格式设计:提供了JSON Schema和Protobuf两种消息格式示例,定义了包含消息ID、时间戳、类型、发送者、有效载荷和元数据的通用结构。 消息类型与路由:将消息分为控制、实时、系统和数据四类,并展示了基于消息类型路由处理的实现方案。 版本控制机制:提出通过协议版本号、向后/向前兼容等策略处理不同版本消息,并给出了版本化消息示例和兼容处理逻辑。 该设计方案涵盖了消息协议的核心要素,为WebSocket通信提供了完整的协议规范参考

天涯学馆 289

vue websocket 显示消息列表

概述: 如果当前用户存在,消息列表中显示消息,消息是来自localstorage,页面监听消息变化,如果有变化就存储在localstorage中。 显示消息 遍历: 时间 是否是自己,展示自己, 页面变化,就监听消息,如果有消息,就显示,监听到有消息变化,存在localStorage 从localStroy中提取出来展示 下一步: 在和一个人聊天的时候,同时,其他人有消息,显示有新消息提醒 ...

wenxi2367的博客 1109

【Dv3Admin】应用WebSocket配置文件解析

模块通过 JWT 鉴权验证用户身份,确保连接安全。连接建立后自动加入频道组,实现按用户推送。使用异步数据库操作提高并发能力,消息统一格式便于前后端解析。支持系统广播、角色定向等多场景推送,并附带未读统计,形成完整消息链路。连接逻辑与鉴权紧耦合,重用性不高。推送流程依赖同步创建与异步发送混用,结构复杂。数据库操作未隔离易影响推送性能。接收逻辑未引入任务队列,扩展性受限。重构时可引入事件驱动架构,提升解耦性与可维护性。

Mr数据杨 966

uniapp框架基于websocket组件实现消息数量实时更新功能

禁止转载

weixin_44243068的博客 2579

WebSocket入门教程(三)-- WebSocket实例:实时获取服务器内存使用情况

WebSocket入门教程(三)-- WebSocket实例:实时获取服务器内存使用情况 服务端和客户端源码

【OpenCV】手眼标定实战:从原理到calibrateHandEye的完整实现

本文详细解析了机器人视觉中的手眼标定原理与实战,重点介绍了如何使用OpenCV的calibrateHandEye函数实现从数据采集到结果验证的完整流程。文章深入剖析了AX=XB核心方程,区分了眼在手上与眼在手外两种配置,并提供了详细的代码示例与避坑指南,帮助开发者精准建立相机与机械臂末端的坐标转换关系,是机器人精准抓取的关键技术。

weixin_29046611的博客 509

Spring Boot WebSocket实时在线人数统计

通过以上完整实现方案,可以构建一个高性能、可靠的实时在线人数统计系统。根据实际业务需求,可以选择内存存储或Redis集群方案,并灵活调整各项配置参数。订阅/topic/onlineUsers。WebSocket连接(/ws)发送/app/hello消息。

我的博客 990

帕塞瓦尔定理(Parseval‘s theorem)的证明

帕塞瓦尔定理(Parseval's theorem)表明了信号在时域和频域上的能量相等。

weixin_42428226的博客 2万+

Neffos广播终极指南:如何向数千个WebSocket连接瞬间推送消息

Neffos 是一款现代、快速且可扩展的 Go 语言 WebSocket 实时框架,其内置的 **Broadcast(广播)机制**让你只需一行代码,即可向数千甚至数万个在线 WebSocket 连接瞬间推送消息。本文将带你从零理解 Neffos 广播的工作原理、精准投递、发送者排除、顺序保证与横向扩展,帮你构建高并发实时推送系统。📡 ## 快速上手:安装 Neffos 实时框架 如果你想在

gitblog_00437的博客 1049

别再手动点按钮了!用C#给PowerMill做个自动化小助手(附完整源码)

本文详细介绍了如何使用C#进行PowerMill二次开发,打造自动化助手以提升CAM工程师的工作效率。通过实战案例和完整源码,展示了从环境配置到核心功能实现的完整流程,包括智能连接模块、项目批量处理器和刀路智能分析器等高级功能开发。

weixin_26899659的博客 347

source tree clone error:fatal remote error: Repository not found

source tree clone error:fatal remote error: Repository not found

Linda的前端开发路 3077

OneBlog实时通讯功能:WebSocket实现管理员与用户实时消息的完整指南

OneBlog作为一款功能强大的Java博客系统,其**实时通讯功能**为管理员和用户提供了高效的实时消息交互体验。通过WebSocket技术,管理员可以实时向在线用户发送通知消息,实现零延迟的即时通讯。本文将详细介绍OneBlog的实时通讯功能实现原理和使用方法。 ## 📡 WebSocket实时通讯功能概述 OneBlog的实时通讯功能基于WebSocket协议实现,这是一种在单个TCP

gitblog_00575的博客 849

python实现边缘检测Canny算子 (附完整源码)

python实现边缘检测Canny算子 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 457

零代码实现WebSocket服务监控:3大核心指标统计方案

你是否还在为WebSocket服务的连接稳定性发愁?是否想实时掌握用户连接状态却苦于没有简单工具?本文将带你用10行脚本实现专业级WebSocket监控系统,无需复杂编程,轻松统计连接数、吞吐量和延迟三大核心指标。 ## 监控原理与环境准备 websocketd的核心价值在于将标准输入输出(STDIN/STDOUT)转化为WebSocket通信通道[README.md](https://lin

gitblog_00362的博客 427

把 Client 当成 ABAP 系统的多租户底座:从 sy-mandt 到 CDS_CLIENT 的隔离机制与工程实践

本文深入解析SAP ABAP系统中Client概念的本质与应用。Client不仅是数据表的MANDT字段,更是会话级别的隔离边界,贯穿用户登录、授权和数据访问控制全过程。文章从ABAP SQL的隐式Client处理机制出发,详细介绍了USING CLIENT、USING ALL CLIENTS等安全跨客户端访问方式,并对比了传统CLIENT SPECIFIED的风险。同时阐述了ABAP CDS中@ClientHandling注解的类型与算法选择,包括#AUTOMATED自动拼接和#SESSION_VARIA

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 182

手把手教你学Simulink——基于Simulink的隔离型DC-DC全桥变换器移相控制建模示例

本文详细介绍了基于Simulink的全桥移相变换器(PSFB)建模与控制方法。首先分析了全桥移相拓扑在大功率应用中的优势,包括ZVS实现、高频化和小型化特点。随后给出了具体设计参数和移相控制策略,采用电压外环+移相角内环的双闭环控制架构。文章重点演示了Simulink建模步骤,包括主电路搭建、移相PWM生成和PI控制器设计,并通过满载稳态、负载阶跃和轻载测试三种场景验证了系统性能。最后总结了工程实践要点,提出自适应控制等扩展方向,强调移相控制通过精准时间管理实现高效能量转换的核心价值。

MHD0815的博客 261

Thor vs 其他WebSocket测试工具:为什么它是最佳选择?

在当今实时应用盛行的时代,WebSocket性能测试工具成为开发者必备的利器。**Thor**作为一款专业的WebSocket基准测试和负载生成工具,在众多测试工具中脱颖而出。本文将深入对比Thor与其他WebSocket测试工具,揭示为什么Thor是WebSocket性能测试的最佳选择。 ## 🔥 Thor的独特优势:专为WebSocket而生 与其他通用的HTTP测试工具不同,Thor是

gitblog_01004的博客 442

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

基于Golang与WebSocket的企业级在线客服系统解决方案

在数字化转型浪潮中,企业面临客户服务响应延迟、多平台沟通碎片化、客服成本居高不下等痛点。传统客服系统难以满足高并发实时通信需求,而商业SaaS方案又存在数据安全和定制化限制。GO-FLY在线客服系统采用Golang高性能语言与WebSocket实时通信技术,为企业提供私有化部署、高并发支持的实时聊天解决方案。 ## 核心技术架构解析 GO-FLY采用现代化的微服务架构设计,结合Gin框架与We

gitblog_00714的博客 574

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

从java角度 抖音直播发布消息量这么大,怎么实时展示的,用了哪些技术实现的,如果用到mq消息不会积压吗

抖音直播的实时消息展示是通过WebSocket + 消息队列 + 分布式缓存 + 流式计算等技术实现的。消息队列的积压问题可以通过水平扩展、动态扩容、消息优先级等方式解决。整体架构设计注重高并发、低延迟和高可用性,确保用户体验流畅。

C18298182575的博客 924

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【全栈AI开发1.0】基于 FastAPI + WebSocket + YOLOv8 的实时视频检测与统计系统

本文介绍了一个基于YOLOv8的轻量级实时视频检测系统,具备实时目标检测、动态统计和Excel自动记录功能。系统采用FastAPI+WebSocket架构,前端模块化设计,支持自动打开浏览器和优雅退出。核心功能包括:基于YOLOv8的实时检测标注、动态统计面板展示、Excel自动记录检测数据(支持动态新增类别列)、低延迟WebSocket视频流推送。文章详细阐述了系统架构、关键代码实现(摄像头采集、YOLO检测器、WebSocket管理等)以及运行效果,适用于智能安防、工业质检等场景的快速部署和二次开发。

m0_75040840的博客 707

yudao-cloud WebSocket实时通信完整指南:企业级消息推送与在线聊天终极解决方案

在当今数字化时代,实时通信已成为现代应用不可或缺的核心功能。无论是电商平台的订单状态实时更新、企业内部的即时通讯协作,还是系统告警的及时推送,都需要高效可靠的WebSocket技术支撑。yudao-cloud基于Spring Boot框架,为企业级应用提供了一套完整的WebSocket实时通信解决方案,让开发者能够快速构建高性能的实时消息推送和在线聊天功能。 ## 实时通信的技术挑战与解决方案

gitblog_01156的博客 778

从 0 到 1 打造企业级站内消息系统:架构设计与实战落地

本文介绍了如何设计和实现一套可扩展、高性能的站内消息系统。系统采用分层架构设计,包含基础消息功能、状态管理、多渠道扩展和实时推送等核心功能。数据库设计上采用消息内容与用户状态分离的模式,支持多种消息类型和渠道。技术实现上使用Spring Boot、MyBatis-Plus、Redis和WebSocket等技术栈,通过缓存、批量操作和异步处理优化性能。系统还提供了短信和邮件渠道的实现示例,并阐述了单元测试和性能优化策略。该设计具有完善的扩展性,为未来业务发展提供了良好的技术基础。

果酱 の 博客 1197

深度解析mirai-api-http的消息处理架构与高并发实现

mirai-api-http作为Mirai机器人框架的核心HTTP API插件,为开发者提供了标准化的消息中间件接口,实现了QQ协议与HTTP/RESTful API的无缝桥接。本文将从架构设计、消息处理机制、并发模型和扩展性四个维度,深入剖析该项目的技术实现,为构建高可靠性的机器人应用提供架构指导。 ## 问题场景:现代机器人应用面临的架构挑战 在构建企业级QQ机器人应用时,开发者通常面临以

gitblog_00837的博客 516

PixelStreamingInfrastructure信令协议权威参考:20+种WebSocket消息类型逐条拆解(v1.1)

PixelStreamingInfrastructure 是 Epic 开源的 **Pixel Streaming(像素流送)基础设施**,它的核心就是一套简洁的 WebSocket 信令协议(当前版本 v1.1.0)。整套协议由 4 类角色之间、**29 种消息类型** 构成,负责在浏览器播放器与 Unreal Engine 引擎之间完成"握手—建连—订阅—流媒体协商—断开"的全部信令流程。本文

gitblog_00677的博客 890

Spring WebSocket配置实战:WebSocketMessageBrokerConfigurer详解

WebSocket作为实现实时双向通信的核心技术,在现代Web应用中扮演着重要角色。其工作原理基于HTTP协议升级机制,建立持久连接后允许服务端主动推送数据,显著提升了实时性要求高的场景下的性能表现。在Spring生态中,WebSocketMessageBrokerConfigurer接口是配置WebSocket通信栈的关键入口,通过分层设计管理连接建立、消息路由和传输优化。该技术特别适用于金融行情推送、实时监控、在线协作等需要低延迟数据同步的场景。结合STOMP子协议和SockJS降级方案,开发者可以构建

weixin_33785108的博客 374
上一篇: Fluent Mybatis 关联查询中关于OR条件的使用
下一篇: fluent-mybatis报错“Parameter ‘ew‘ not found. Available parameters are [list, param1]”
AI时代_hexiaoyu
博客等级 码龄9年 8粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值