跟着源码学IM(十二):基于Netty打造一款高性能的IM即时通讯程序即时通讯开发

协议,这玩意儿相信大家肯定不陌生了,简单回顾一下协议的概念:网络协议是指一种通信双方都必须遵守的约定,两个不同的端,按照一定的格式对数据进行“编码”,同时按照相同的规则进行“解码”,从而实现两者之间的数据传输与通信。当自己想要打造一款IM通信程序时,对于消息的封装、拆分也同样需要设计一个协议,通信的两端都必须遵守该协议工作,这也是实现通信程序的前提。但为什么需要通信协议呢?因为TCP/IP中是基于流的方式传输消息,消息与消息之间没有边界,而协议的目的则在于约定消息的样式、边界等。

不知大家是否还记得之前我聊到的RESP客户端协议,这是Redis提供的一种客户端通信协议。如果想要操作Redis,就必须遵守该协议的格式发送数据。这个协议特别简单,如下:

1)首先要求所有命令,都以*开头,后面跟着具体的子命令数量,接着用换行符分割;

3)最后再拼接上具体的子命令,同样用换行符分割。

这样描述有些令人难懂,那就直接看个案例,例如一条简单set命令。如下:

按照Redis的规定,但凡满足RESP协议的客户端,都可以直接连接并操作Redis服务端,这也就意味着咱们可以直接通过Netty来手写一个Redis客户端。代码如下:

//基于Netty、RESP协议实现的Redis客户端publicclassRedisClient{//换行符的ASCII码staticfinalbyte[]LINE={13,10};

publicstaticvoidmain(String[]args){EventLoopGroupworker=newNioEventLoopGroup();Bootstrapclient=newBootstrap();

在上述这个案例中,也仅仅只是通过respCommand()这个方法,对用户输入的指令进行了转换。同时在上面通过Netty,与Redis的地址、端口建立了连接。在连接建立成功后,就会向Redis发送一条转换成RESP指令的set命令。接着等待Redis的响应结果并输出,如下:+OK因为这是一条写指令,所以当Redis收到执行完成后,最终就会返回一个OK,大家也可直接去Redis中查询,也依旧能够查询到刚刚写入的name这个键值。

前面咱们自己针对于Redis的RESP协议,对用户指令进行了封装,然后发往Redis执行。但对于这些常用的协议,Netty早已提供好了现成的处理器,想要使用时无需从头开发,可以直接使用现成的处理器来实现。比如现在咱们可以基于Netty提供的处理器,实现一个简单的HTTP服务器。代码如下:

Netty除开提供了HTTP协议的处理器外,还提供了DNS、HaProxy、MemCache、MQTT、Protobuf、Redis、SCTP、RTSP.....一系列协议的实现,具体定义位于io.netty.handler.codec这个包下,当然,咱们也可以自己实现自定义协议,按照自己的逻辑对数据进行编解码处理。很多基于Netty开发的中间件/组件,其内部基本上都开发了专属的通信协议,以此来作为不同节点间通信的基础,所以解下来咱们基于Netty也来自己设计一款通信协议,这也会作为后续实现聊天程序时的基础。

前面简单聊到过,所谓的自定义协议就是自己规定消息格式,以及自己实现编/解码器对消息实现封装/拆解,所以这里想要自定义一个消息协议,就只需要满足前面两个条件即可。因此实现如下:

上述自定义的协议,也就是一定规则的字节数据,每条消息数据的组成如下:1)魔数:使用第1~5个字节来描述,这个魔数值可以按自己的想法自定义;2)版本号:使用第6个字节来描述,不同数字表示不同版本;3)序列化算法:使用第7个字节来描述,不同数字表示不同序列化方式;4)消息类型:使用第8个字节来描述,不同的消息类型使用不同数字表示;5)消息序号:使用第9~12个字节来描述,其实就是一个四字节的整数;6)正文长度:使用第13~16个字节来描述,也是一个四字节的整数;7)消息正文:长度不固定,根据每次具体发送的数据来决定。

首先来定义两个拉群时用的消息体,如下:

前面单聊有单聊的会话管理机制,而实现多人群聊时,依旧需要有群聊的会话管理机制,首先封装了一个群聊实体类。如下:publicclassGroup{//聊天室名称privateStringname;//聊天室成员privateSetmembers;publicstaticfinalGroupEMPTY_GROUP=newGroup("empty",Collections.emptySet());publicGroup(Stringname,Setmembers){this.name=name;this.members=members;}//省略其他Get/Settings、toString()方法.....}接着定义了一个群聊会话的顶级接口,如下:

前面客户端的功能菜单中,3对应着拉群功能,所以咱们需要对3做具体的功能实现。逻辑如下:>case"3":

这里就不重复赘述了,还是之前的套路,定义一个客户端用的消息体,如下:

依旧先来做客户端的实现,实现了客户端之后再去完成服务端的实现,客户端实现如下:

《跟着源码学IM(一):手把手教你用Netty实现心跳机制、断线重连机制》《跟着源码学IM(二):自已开发IM很难?手把手教你撸一个Andriod版IM》《跟着源码学IM(三):基于Netty,从零开发一个IM服务端》《跟着源码学IM(四):拿起键盘就是干,教你徒手开发一套分布式IM系统》《跟着源码学IM(五):正确理解IM长连接、心跳及重连机制,并动手实现》《跟着源码学IM(六):手把手教你用Go快速搭建高性能、可扩展的IM系统》《跟着源码学IM(七):手把手教你用WebSocket打造Web端IM聊天》《跟着源码学IM(八):万字长文,手把手教你用Netty打造IM聊天》《跟着源码学IM(九):基于Netty实现一套分布式IM系统》《跟着源码学IM(十):基于Netty,搭建高性能IM集群(含技术思路+源码)》《跟着源码学IM(十一):一套基于Netty的分布式高可用IM详细设计与实现(有源码)》《跟着源码学IM(十二):基于Netty打造一款高性能的IM即时通讯程序》(*本文)《SpringBoot集成开源IM框架MobileIMSDK,实现即时通讯IM聊天功能》

THE END
1.在线课程的特点依托现代信息技术,随着网站设计、网络课程等的出现,网络课程具有不同于传统课程的功能和特点。总之,在线课程可以适应基础教育课程改革的趋势和要求。具体来说,它表现出以下主要特点。 I、课程覆盖的民主化 让不同地区、不同国家、无论贫富的青少年都能享受到最理想的教育,义务教育成为受教育的权利,教育民主化在互联网https://www.xjcj-edu.com/web/12457.html
2.AI自习室与传统自习室的区别是什么?AI自习室与传统自习室在学习环境、教学资源、个性化程度、学习效果、互动性、成本效益以及适应性等方面存在显著差异。学习环境 · AI自习室:融入高科技,能根据学生需求智能调整光线、温度等,创造最佳学习条件。此外,AI自习室利用虚拟现实(VR)、增强现实(AR)等先进技术,打造沉浸式学习环境,极大地提升了学习的沉浸感https://baijiahao.baidu.com/s?id=1817571087265156947&wfr=spider&for=pc
3.推荐算法中的在线学习和离线学习有何区别,各自的优缺点是什么在实际应用中,可以根据具体的场景需求来选择在线学习或离线学习,也可以结合两者的优势进行混合使用。例如,在推荐系统中可以使用离线学习来训练初始模型,在线学习来实时更新模型参数,以实现更好的推荐效果和用户体验。 综上所述,在线学习和离线学习各有优缺点,具体选择取决于应用场景和需求。0https://www.mbalib.com/ask/question-ec5c1bbee149c6534d0a725ffdb15235.html
4.线上线下融合教学的优势不足与发展策略内容这种全新的学习模式不仅可以实现教师的学习目标,而且可以满足学生的学习需求,激发学生的学习兴趣,在良好的学习氛围中提高学习效果。然而,线上与线下这两种教学方式各有优点和缺点,这两种方式是不能完全替代的,有一定的互补性。笔者在分析两种教学方式优缺点的基础上,从不同的层面对深化两种教学方式的融合进行了思考。https://tpd.xhedu.sh.cn/cms/app/info/doc/index.php/92024
5.在线初中数学,重塑学习体验的革命性新模式科技在线初中数学为学习者提供了全新的学习体验,学生应充分利用在线资源,发挥主观能动性,提高学习效果,家长和教育工作者也应关注在线教育的发展,为学生提供支持和指导,相信随着技术的不断进步,在线初中数学学习将越来越受到青睐,为更多学生带来更好的学习体验。 http://www.huayiii.com/post/13980.html
6.java学习路线(鱼皮)鱼皮java学习路线资源Java学习路线(鱼皮) Java学习路线(鱼皮)是一条龙版本的学习路线,从入门到入土,旨在帮助学习者快速掌握Java开发的所有知识点。本路线的特点是新、完整、实用、开源、回馈社区、持续更新。 学习路线的主要内容包括准备阶段、Java入门、Java进阶、Java高级、Java框架、Java项目等多个部分,每个部分都包含了相关的知识点、https://download.csdn.net/download/qq_25355771/86248683
7.懂了么app官方版下载官方手机版利用平台的考试分析系统,根据孩子的优缺点提供改进建议;实现家长与学校的实时沟通,让家长辅导孩子省心省力,增加参与度。 软件特色 1、全国名师在线答疑 系统提供来自全国各地一线名师的在线指导和答疑。 2、数据文件实时查询 学生过往成绩可通过微信公众号和APP随时查看 3、统一考试、联合考试网上启动 通过智慧教育云平台https://www.dianlut.com/soft/703734.html
8.AIR学术李升波:将强化学习用于自动驾驶:技术挑战与发展趋势实际上,我们具有两套将强化学习应用于自动驾驶汽车的途径:第一,先离线训练策略、再在线应用策略,即OTOI方法:将强化学习视作最优控制问题的求解器。或使用模型,或使用预先采集的数据,先离线训练一个最优策略,然后部署到自动驾驶汽车,实现在线控制应用。第二,同时训练和应用策略,即SOTI方法:这是利用强化学习的探索试错https://air.tsinghua.edu.cn/info/1008/1323.htm
9.2024年打字练习软件推荐作为一个互联网老兵,深知在选择打字练习工具时,用户不仅关注其实用性和效果,还越来越重视软件的便捷性、个性化以及互动体验。今天,我们将深入探讨本地桌面软件与在线打字练习平台两大类别的优缺点,并基于实际测评与市场反馈,推荐当前最热门的六款打字练习软件。 https://m.zol.com.cn/otherbbs/d4_32406.html
10.MLK机器学习常见算法优缺点了解一下腾讯云开发者社区MLK | 机器学习常见算法优缺点了解一下 MLK,即Machine Learning Knowledge,本专栏在于对机器学习的重点知识做一次梳理,便于日后温习,这篇文章很久之前在本公众号发过,现在拿回来整理下,也算是一种温故而知新了。 ? 前情回顾 MLK | 那些常见的特征工程https://cloud.tencent.com/developer/article/1485883
11.息流FlowUs评测:从输入到输出,内置工作流的笔记软件和知识管理AI写作助手:支持头脑风暴、列出执行步骤、罗列大纲、分析优缺点、内容解释、日常小记、故事创作、写文章、翻译、总结、扩写、续写等多种 AI写作场景。 AI 多维表格:通过 AI一键创建多维表格,对多维表格内容进行总结、解释、翻译等数据处理任务。 支持中文界面,针对中文用户使用习惯进行细节优化 https://sspai.com/post/73465
12.强化学习的基本概念在线学习和离线学习针对的是在强化学习模型在训练过程中交互数据的使用方式。在线学习的强化学习模型,会在一个交互之后,立即用本次交互得到的经验进行训练。而离线学习的强化学习模型,往往是先将多个交互的经验存储起来,然后在学习的时候,从存储的经验中取出一批交互经验来学习。 https://www.jianshu.com/p/28625d3a60e6
13.学科类阅读写作编程成人考证学习类等都有!网课哪家学习者可以通过在家上网学习,只要有网的地方,即可利用碎片化的时间学习。 视频、图片和资料可在电子产品上反复观看,学习者可针对自己学习弱项强化训练。 网上通过课程学习,对学习者而言,价格相对友好。 停课不停学。 打破地域和国界。 网课有哪些优缺点? https://www.extrabux.cn/chs/guide/6435200