站长统计app软件下载2021东营做网站排名

张小明 2026/1/19 19:19:07
站长统计app软件下载2021,东营做网站排名,外包网站会自己做原型吗,百度电脑版网页#x1f4e1; 前言#xff1a;为什么选 Netty-SocketIO#xff1f; Spring 官方提供了 spring-boot-starter-websocket#xff0c;为什么不用#xff1f; 虽然官方的支持 STOMP 协议#xff0c;上手简单#xff0c;但在面对高并发、长连接维持、心跳检测、断线自动重连等… 前言为什么选 Netty-SocketIOSpring 官方提供了spring-boot-starter-websocket为什么不用虽然官方的支持 STOMP 协议上手简单但在面对高并发、长连接维持、心跳检测、断线自动重连等复杂场景时基于Netty封装的netty-socketio表现得更加稳健和高性能。它完美适配了前端的socket.io-client库让前后端联调变得异常简单。️ 一、 架构设计用户如何找到彼此IM 系统的核心在于**“路由”**当 UserA 发消息给 UserB 时服务器怎么知道 UserB 的长连接是哪一个我们需要维护一张用户 ID – Socket Session的映射表。IM 消息流转图 (Mermaid):IM 核心服务1. 发送消息 {to: UserB}2. 查找 SessionMap3. 获取 UserB 的连接4. 异步持久化5. 推送事件 push_event6. 收到消息用户 A (Vue 前端)Netty ServerMap: UserId - UUIDSocketIOClient (UserB)MySQL / MongoDB用户 B (Vue 前端)渲染聊天气泡️ 二、 后端实战搭建 Netty-SocketIO 服务1. 引入依赖dependencygroupIdcom.corundumstudio.socketio/groupIdartifactIdnetty-socketio/artifactIdversion1.7.22/version/dependency2. 配置启动类 (SocketIOConfig.java)我们不使用 Tomcat 的端口而是另起一个 Netty 端口如 9092。ConfigurationpublicclassSocketIOConfig{BeanpublicSocketIOServersocketIOServer(){com.corundumstudio.socketio.Configurationconfignewcom.corundumstudio.socketio.Configuration();config.setHostname(localhost);config.setPort(9092);// 关键设置最大帧长度防止发大图报错config.setMaxFramePayloadLength(1024*1024);config.setMaxHttpContentLength(1024*1024);// 握手协议参数SocketConfigsocketConfignewSocketConfig();socketConfig.setReuseAddress(true);config.setSocketConfig(socketConfig);returnnewSocketIOServer(config);}// Spring Boot 启动时同时启动 Netty 服务BeanpublicSpringAnnotationScannerspringAnnotationScanner(SocketIOServersocketServer){returnnewSpringAnnotationScanner(socketServer);}}3. 核心业务逻辑 (MessageEventHandler.java)这里实现了上线注册、单聊、群聊逻辑。ComponentpublicclassMessageEventHandler{// 线程安全的 Map存储 UserId - SocketClient 的映射publicstaticfinalConcurrentHashMapString,UUIDUSER_CLIENT_MAPnewConcurrentHashMap();AutowiredprivateSocketIOServerserver;// --- 1. 客户端连接 (握手) ---OnConnectpublicvoidonConnect(SocketIOClientclient){// 前端连接时带上参数http://localhost:9092?userId1001StringuserIdclient.getHandshakeData().getSingleUrlParam(userId);if(userId!null){USER_CLIENT_MAP.put(userId,client.getSessionId());System.out.println(用户上线: userId);}}// --- 2. 客户端断开 ---OnDisconnectpublicvoidonDisconnect(SocketIOClientclient){StringuserIdclient.getHandshakeData().getSingleUrlParam(userId);if(userId!null){USER_CLIENT_MAP.remove(userId);System.out.println(用户下线: userId);}}// --- 3. 处理单聊消息 ---OnEvent(send_msg)publicvoidonEvent(SocketIOClientclient,ChatMessageRequestdata){StringtoUserIddata.getToUserId();UUIDtargetSessionIdUSER_CLIENT_MAP.get(toUserId);// 如果用户在线直接推送if(targetSessionId!nullserver.getClient(targetSessionId)!null){server.getClient(targetSessionId).sendEvent(receive_msg,data);}else{// 用户不在线存入数据库标记为“未读消息”saveOfflineMessage(data);}}// --- 4. 处理群聊 (加入房间) ---OnEvent(join_group)publicvoidonJoinGroup(SocketIOClientclient,StringgroupId){client.joinRoom(groupId);// SocketIO 自带房间管理}OnEvent(send_group_msg)publicvoidonGroupMsg(SocketIOClientclient,ChatMessageRequestdata){// 直接向房间内广播server.getRoomOperations(data.getGroupId()).sendEvent(receive_group_msg,data);}} 三、 前端 Vue3 实战Socket.io-client前端使用socket.io-client库代码极其简洁。安装npminstallsocket.io-client连接与收发import{io}fromsocket.io-client;// 1. 建立连接 (带上自己的 ID)constsocketio(http://localhost:9092,{query:{userId:1001},transports:[websocket]// 强制使用 WebSocket不用轮询});// 2. 监听连接成功socket.on(connect,(){console.log(连接成功SessionID:,socket.id);});// 3. 接收消息 (监听 receive_msg 事件)socket.on(receive_msg,(data){console.log(收到新消息:,data);// 这里将 data push 到聊天记录数组中页面会自动渲染messages.value.push(data);});// 4. 发送消息constsendMessage(){socket.emit(send_msg,{fromUserId:1001,toUserId:1002,content:你好今晚吃什么,type:text});}; 四、 进阶挑战分布式集群下的 Session 共享如果你的用户量达到 10 万一台服务器扛不住你需要部署两台 Netty 服务。问题来了UserA 连上了 Server1UserB 连上了 Server2。UserA 发消息给 UserBServer1 的内存 Map 里找不到 UserB 的 Session怎么办解决方案Redis Pub/Sub (发布订阅)Server1 发现 UserB 不在本地。Server1 将消息 Publish 到 Redis 的频道IM_CHANNEL。Server2 订阅了该频道收到消息后发现 UserB 在自己这儿。Server2 将消息推送给 UserB。Redisson 提供了很好的支持或者直接使用 Socket.IO 官方的Redis Adapter。 总结通过 Spring Boot Netty-SocketIO我们只用了几百行代码就实现了一个高实时性的 IM 系统核心。这不仅是一个聊天工具它还是即时通知、在线客服、游戏对战等场景的基石。Next Step:现在的消息只存在内存里重启就丢了。试着引入MongoDB来存储聊天记录写入速度快结构灵活并实现“历史消息回溯”功能你的 IM 系统就具备商业价值了
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

哪个网站上可以做初中数学题校园二手交易网站开发背景

PyTorch-CUDA-v2.7镜像中如何监控GPU使用率 在深度学习项目中,我们常常会遇到这样的场景:模型已经跑起来了,但训练速度远低于预期。打开终端执行 nvidia-smi,却发现 GPU 利用率长期徘徊在 10% 以下,而 CPU 却几乎满载—…

张小明 2026/1/17 17:09:22 网站建设

西宁好的网站建设wordpress去掉google字体

想要告别繁琐的Analogue Pocket文件管理吗?pocket-sync正是你需要的完美解决方案。这款专为复古掌机设计的GUI工具,将复杂的核心更新、存档备份、截图处理等操作变得简单直观。无论是新手玩家还是资深爱好者,都能通过这款工具快速掌握掌机的各…

张小明 2026/1/17 17:09:24 网站建设

友情网站企业为什么要增资

第一章:Open-AutoGLM视频号推荐引擎概述Open-AutoGLM是一款基于多模态大语言模型的智能推荐系统,专为短视频内容平台设计,致力于提升用户在视频号场景下的内容发现效率与观看体验。该引擎融合了视觉理解、自然语言处理与用户行为建模技术&…

张小明 2026/1/17 17:09:26 网站建设

深圳网站建设列表网网站首页的psd怎么做

GPT-SoVITS模型微调实战指南 在语音合成技术飞速发展的今天,我们正经历从“通用播报”到“个性发声”的范式转变。过去,想要让机器模仿某个人的声音,往往需要数小时精心录制、逐字对齐的语音数据——这对普通用户几乎是不可逾越的门槛。而现在…

张小明 2026/1/17 17:09:27 网站建设

网站做熊掌号码网站建设有没有

目录具体实现截图项目介绍论文大纲核心代码部分展示项目运行指导结论源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作具体实现截图 本系统(程序源码数据库调试部署讲解)同时还支持java、ThinkPHP、Node.js、Spring B…

张小明 2026/1/17 17:09:28 网站建设

优秀设计工作室网站广告投放需要什么资质

MoeMemosAndroid 终极使用指南:开源备忘录应用配置完全教程 【免费下载链接】MoeMemosAndroid An app to help you capture thoughts and ideas 项目地址: https://gitcode.com/gh_mirrors/mo/MoeMemosAndroid MoeMemosAndroid 是一款功能强大的开源备忘录应…

张小明 2026/1/17 17:09:27 网站建设