当前位置: 首页 > news >正文

【Netty源码解读和权威指南】第49篇:Netty实战——开发高性能im即时通讯系统

上一篇【第48篇】Netty整合Spring——生产级Netty服务的最佳实践
下一篇【第50篇】Netty MQTT实战——开发物联网消息服务器


一、IM系统架构

+-----+ +-----+ +-----+ +------------------+ | 客户端 | | 客户端 | | 客户端 | | IM接入服务器 | +-----+ +-----+ +-----+ +------------------+ | | | | +---------+---------+--------------+ | +------------------+ | 消息路由层 | +------------------+ | +-------------+-------------+ | | +-------------+ +-------------+ | 用户管理 | | 消息存储 | +-------------+ +-------------+

二、核心Handler实现

@ChannelHandler.SharablepublicclassIMServerHandlerextendsChannelInboundHandlerAdapter{// userId → Channel映射privatestaticfinalConcurrentHashMap<String,Channel>userChannels=newConcurrentHashMap<>();@OverridepublicvoidchannelRead(ChannelHandlerContextctx,Objectmsg){IMMessageimMsg=(IMMessage)msg;switch(imMsg.getType()){caseLOGIN:handleLogin(ctx,imMsg);break;caseSINGLE_CHAT:handleSingleChat(ctx,imMsg);break;caseGROUP_CHAT:handleGroupChat(ctx,imMsg);break;caseHEARTBEAT:handleHeartbeat(ctx);break;}}privatevoidhandleLogin(ChannelHandlerContextctx,IMMessagemsg){userChannels.put(msg.getFromUser(),ctx.channel());ctx.channel().attr(AttributeKey.valueOf("userId")).set(msg.getFromUser());ctx.writeAndFlush(IMMessage.of(LOGIN_RESP,"OK"));System.out.println("用户登录: "+msg.getFromUser());}privatevoidhandleSingleChat(ChannelHandlerContextctx,IMMessagemsg){Channeltarget=userChannels.get(msg.getToUser());if(target!=null&&target.isActive()){target.writeAndFlush(msg);}else{ctx.writeAndFlush(IMMessage.of(ERROR,"用户不在线"));}}@OverridepublicvoidchannelInactive(ChannelHandlerContextctx){StringuserId=(String)ctx.channel().attr(AttributeKey.valueOf("userId")).get();if(userId!=null){userChannels.remove(userId);System.out.println("用户下线: "+userId);}}}

三、消息协议

publicclassIMMessage{publicenumType{LOGIN,LOGIN_RESP,SINGLE_CHAT,GROUP_CHAT,HEARTBEAT,ERROR}privateTypetype;privateStringfromUser;privateStringtoUser;privateStringcontent;privatelongtimestamp;// getters/setters...}// 编码器publicclassIMMessageEncoderextendsMessageToByteEncoder<IMMessage>{protectedvoidencode(ChannelHandlerContextctx,IMMessagemsg,ByteBufout){// type(1B) + fromLen(1B) + fromUser + toLen(1B) + toUser + contentLen(4B) + contentout.writeByte(msg.getType().ordinal());writeString(out,msg.getFromUser());writeString(out,msg.getToUser());out.writeLong(msg.getTimestamp());byte[]content=msg.getContent().getBytes();out.writeInt(content.length);out.writeBytes(content);}}

四、群聊广播

// 群聊实现:遍历channel列表广播privatestaticfinalMap<String,Set<Channel>>groupChannels=newConcurrentHashMap<>();privatevoidhandleGroupChat(ChannelHandlerContextctx,IMMessagemsg){Set<Channel>members=groupChannels.get(msg.getToUser());// toUser=群IDif(members!=null){for(Channelmember:members){if(member.isActive()&&member!=ctx.channel()){member.writeAndFlush(msg);}}}}

五、总结

功能实现方式
用户登录userId → Channel映射
单聊根据userId获取Channel直接发送
群聊遍历群成员Channel列表广播
心跳IdleStateHandler检测
下线channelInactive移除映射

上一篇【第48篇】Netty整合Spring——生产级Netty服务的最佳实践
下一篇【第50篇】Netty MQTT实战——开发物联网消息服务器


http://www.jsqmd.com/news/1075547/

相关文章:

  • (文末附skill资源)基于QClaw创建一个输入视频链接提取视频音频为文本的skill
  • 华硕笔记本性能调优神器:G-Helper全面解析与实用指南
  • DBeaver如何转储数据库(导出)
  • JMeter 2.6多线程压力测试实战指南:从脚本设计到结果分析
  • 一款Python语言Django框架DDD脚手架,适合快速搭建项目
  • 株洲零界传媒:专注GEO优化的AI品牌服务商
  • 上海AI智能体培训机构推荐:如何选择适合自己的AI学习平台
  • 构建能理解if/else条件逻辑的聊天机器人
  • 团队级AI协同操作系统:五层架构实现Claude Code规模化落地
  • 服装商城系统-python+Django
  • Cockpit:一个灵活的开源无头内容管理系统
  • Java 创建线程:继承 Thread 子类 vs 实现 Runnable 接口
  • Video2X技术架构深度解析:如何构建高性能视频超分辨率处理框架
  • Windows 11终极瘦身指南:3步免费清理系统臃肿
  • 2026美食视频背景音乐精选榜单:从国内首选到国际平台的差异化风格指南
  • LangFlow终极指南:三步构建智能AI应用的完整教程
  • 【共创季稿事节】鸿蒙原生 ArkTS 布局实战:Tabs + animateTo 实现页面切换过渡动画
  • 海量项目模版库实战应用与价值落地
  • MCP协议:AI工具调用的标准化插座与工程化落地指南
  • 国内如何稳定使用Gemini?七层协议适配与上下文保真实战指南
  • Windows 11终极优化指南:3步轻松移除系统臃肿,恢复电脑流畅体验
  • Windows 11系统优化:3步免费打造高效纯净系统体验
  • OpCore Simplify终极指南:3步完成专业级黑苹果EFI配置
  • 音乐片段二创改编工具
  • 从一个传文件的破需求,到一个能挂公网的“瞬传“:我用 WorkBuddy 把它从 HTML 一路做到了 Java
  • Serverless 架构实战:冷启动优化与事件驱动流水线的工程实践
  • 插头 DP 学习笔记
  • 2026年GEO运营的核心命题:先分析,再优化
  • GetQzonehistory:三步完成QQ空间历史数据完整备份的终极方案
  • Chrome侧边栏Gemini:浏览器原生AI工作流的实战指南