跟着源码学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.在线课程的特点在网络课程中,教师在教学中使用的教材将演变为以现代教学媒体为核心的多媒体教材体系,实现教材与学习者的双向互动,将学生带入学习情境,学生将根据自己的意愿亲自操作、选择和开发学习内容,在积极参与学习中获得经验,运用个人想象力产生和保持学习的热情和兴趣。 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.java学习路线(鱼皮)鱼皮java学习路线资源Java学习路线(鱼皮) Java学习路线(鱼皮)是一条龙版本的学习路线,从入门到入土,旨在帮助学习者快速掌握Java开发的所有知识点。本路线的特点是新、完整、实用、开源、回馈社区、持续更新。 学习路线的主要内容包括准备阶段、Java入门、Java进阶、Java高级、Java框架、Java项目等多个部分,每个部分都包含了相关的知识点、https://download.csdn.net/download/qq_25355771/86248683
6.懂了么app官方版下载官方手机版利用平台的考试分析系统,根据孩子的优缺点提供改进建议;实现家长与学校的实时沟通,让家长辅导孩子省心省力,增加参与度。 软件特色 1、全国名师在线答疑 系统提供来自全国各地一线名师的在线指导和答疑。 2、数据文件实时查询 学生过往成绩可通过微信公众号和APP随时查看 3、统一考试、联合考试网上启动 通过智慧教育云平台https://www.dianlut.com/soft/703734.html
7.我的线上教与学AmaliaJiva:线上环境建立了真正趣味盎然的我认为我们本学期将花费一些时间来观察线上教育的优缺点。机会和益处是显而易见的,不仅包括灵活性和互动性,还包括平等获得教育的机会和较低的教育门槛。 但另一方面,人类具有高度的社会性,纯虚拟环境无法完全替代实时互动。 另外,大学教育不仅仅包括课堂上课,因此我希望学生继续从传统校园环境中的社交机会和课外活动中https://www.ji.sjtu.edu.cn/cn/?p=88270
8.2024年打字练习软件推荐作为一个互联网老兵,深知在选择打字练习工具时,用户不仅关注其实用性和效果,还越来越重视软件的便捷性、个性化以及互动体验。今天,我们将深入探讨本地桌面软件与在线打字练习平台两大类别的优缺点,并基于实际测评与市场反馈,推荐当前最热门的六款打字练习软件。 https://m.zol.com.cn/otherbbs/d4_32406.html
9.MLK机器学习常见算法优缺点了解一下腾讯云开发者社区MLK | 机器学习常见算法优缺点了解一下 MLK,即Machine Learning Knowledge,本专栏在于对机器学习的重点知识做一次梳理,便于日后温习,这篇文章很久之前在本公众号发过,现在拿回来整理下,也算是一种温故而知新了。 ? 前情回顾 MLK | 那些常见的特征工程https://cloud.tencent.com/developer/article/1485883
10.超全golang面试题合集+golang学习指南+golang知识图谱+入门goml Go中的在线机器学习。 Goptuna 用于Go语言编写的黑盒函数的贝叶斯优化框架。一切都会被优化。 goRecommend 用Go编写的推荐算法库。 gorgonia 基于图形的计算库,例如Theano for Go,它提供了用于构建各种机器学习和神经网络算法的原语。 gorse 基于Go编写的协作过滤的离线推荐系统后端。 goscore 用于PMML的Go Scorihttps://github.com/18737628639/golangFamily
11.强化学习的基本概念在线学习和离线学习针对的是在强化学习模型在训练过程中交互数据的使用方式。在线学习的强化学习模型,会在一个交互之后,立即用本次交互得到的经验进行训练。而离线学习的强化学习模型,往往是先将多个交互的经验存储起来,然后在学习的时候,从存储的经验中取出一批交互经验来学习。 https://www.jianshu.com/p/28625d3a60e6
12.基于机器学习的增材制造合金材料力学性能预测研究进展与挑战监督学习的本质是学习输入到输出映射的统计规律. 根据输入与输出变量的类型不同, 可将监督学习分为回归和分类, 其中分类主要针对离散型变量, 应用涉及缺陷在线监测等; 而回归主要针对连续型变量, 应用涉及参数优化、质量控制和性能预测等. 此外, 根据模型的参数分布是否假定, 还可将监督学习模型分为参数模型和非参数https://lxxb.cstam.org.cn/article/doi/10.6052/0459-1879-23-542?viewType=HTML