

基于Netty,从零开发IM(二):编码实践篇(单聊功能)
source link: http://www.52im.net/thread-3974-1-1.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

![]() 本文由作者“大白菜”分享,个人博客 cmsblogs.cn,即时通讯收录时有较多修订和改动。注意:本系列是给IM初学者的文章,IM老油条们还望海涵,勿喷! 接上篇《IM系统设计篇》,本篇主要讲解的是通过实战编码实现IM的单聊功能,内容涉及技术原理、编码实践。![]()
2、写在前面建议你在阅读本文之前,务必先读本系列首篇《IM系统设计篇》,在着重理解IM系统的理论设计思路之后,再来读实战代码则效果更好。最后,在开始本文之前,请您务必提前了解Netty的相关基础知识,可从本系列首篇《IM系统设计篇》中的“知识准备”一章开始。 ![]() 3、系列文章本文是系列文章的第2篇,以下是系列目录:
4、运行效果本篇我们主要来实现的是IM单聊功能,具体就是:模拟IM聊天的两个用户分别登陆各自的账号,然后可以互相发送聊天消息。我们提前看一下本篇要实现的功能运行效果。 客户端 1 登陆效果: ![]()
![]()
![]()
![]() 5、技术原理5.1概述上节中,可以看到此次实战的运行效果是一个基于 console 控制台的聊天,根据上篇《IM系统设计篇》的思路设计,我们也知道主要核心是服务端保存一份关系映射,通过接受人 ID 找到对应的通道进行消息发送。但是,我们要想实现具体的功能,则需要大体上做一个核心技术实现步骤的拆解,具体拆分成以下三步。 5.2第一步: 编码和解码的实现针对IM单聊功能,有两个核心技术点:
对于实体对象的序列化和反序列化,推荐使用 Fastjson 框架去实现,而不是Netty官方示例所使用的对象流。 同时为了更加规范的管理不同业务实体,我们需要定义一个实体基类,所有的业务实体都继承它(下面的章节会详细讲解)。 5.3第二步: 登录和消息发送两个业务点的实现登录主要是为了让用户 ID 和通道(就是Netty中的Channel,也即网络连接)进行绑定。在登录成功之后为 Channel 通过 attr() 方法绑定该用户 ID,主要目的有三个:
* 友情提示:用户ID和Chennel的绑定,可以参考成熟的开源IM工程 MobileIMSDK 中的实现逻辑 OnlineProcessor.java,以便通过更接近IM产品级实践进行学习。 5.4第三步: 映射关系的实现前面也分析过了,服务端需要保存一份用户ID和Channel映射关系,这个映射关系只需要使用一个 Map 进行存储即可,即 Map<Integer,Channel>,其中:key 是用户 ID、value 是 Channel(Channel也就是客户端的网络连接对象啦)。这部分需要交待的不多,理解清楚用户ID和Channel的关系就足够了。 接下来就是具体的编码实战了。。。 6、实体定义实战实体的设计,主要从两个方面进行入手考虑:
![]()
7、编码和解码实战7.1依赖坐标
7.2编码实现
7.3解码实现
7.4指令和实体关系为什么需要这么一个工具类呢?指令表示的是业务类型,不同的业务对应不同的实体,那么解码的时候,怎么知道反序列化成什么样的实体呢?思路是获取到的指令,再根据指令找到对应的实体即可。
8、客户端代码实战8.1Pipeline 管理链表
8.2业务 Handler所有的业务处理在同一个 Handler 里面进行处理,通过判断实体类型来区分不同的业务处理。
9、服务端代码实战9.1Pipeline 管理链表
9.2业务 Handler
10、本篇小结本篇主要编码实战了IM的单聊功能,实现思路相对还是稍微有点小复杂。大家主要核心掌握以下几点思路就可以了:
11、参考资料[1] 手把手教你用Netty实现心跳机制、断线重连机制[2] 自已开发IM很难?手把手教你撸一个Andriod版IM [3] 基于Netty,从零开发一个IM服务端 [4] 拿起键盘就是干,教你徒手开发一套分布式IM系统 [5] 正确理解IM长连接、心跳及重连机制,并动手实现 [6] 手把手教你用Go快速搭建高性能、可扩展的IM系统 [7] 手把手教你用WebSocket打造Web端IM聊天 [8] 万字长文,手把手教你用Netty打造IM聊天 [9] 基于Netty实现一套分布式IM系统 [10] 基于Netty,搭建高性能IM集群(含技术思路+源码) [11] SpringBoot集成开源IM框架MobileIMSDK,实现即时通讯IM聊天功能 | ||||||||||||||||||||||||||||
来源:即时通讯网 - 即时通讯开发者社区! |
Recommend
-
13
Netty作为基于异步事件驱动的网络通信框架,广泛应用于服务端和客户端中,例如RPC远程框架如Dubbo、消息队列RocketMQ的生产者消费者通信以及zookeeper等。Netty是对JDK自带NIO的封装,其优点大家都知道。翻看Netty源码,里面内容繁多,代码嵌套深、继承及实...
-
4
“用户在线状态的一致性”(单聊好友在线状态、群聊用户在线状态)是IM应用领域比较难解决的一个技术问题,如何精准实时的获得好友、群友的在线状态,是今天将要探讨的话题。 2、IM开发干货系列文章,欢迎关注...
-
9
字符串是我们程序中最常用到的消息格式,也是最简单的消息格式,但是正因为字符串string太过简单,不能附加更多的信息,所以在netty中选择的是使用byteBuf作为最底层的消息传递载体。 虽然底层使用的ByteBuf,但是对于程序员来说,还是希望能够使用这种...
-
3
在json之前,xml是最常用的数据传输格式,虽然xml的冗余数据有点多,但是xml的结构简单清晰,至今仍然运用在程序中的不同地方,对于netty来说自然也提供了对于xml数据的支持。 netty对xml的支持表现在两个方面,第一个方面是将编码过后的多个xml数据进行...
-
2
我们在程序中除了使用常用的字符串进行数据传递之外,使用最多的还是JAVA对象。在JDK中,对象如果需要在网络中传输,必须实现Serializable接口,表示这个对象是可以被序列化的。这样就可以调用JDK自身的对象对象方法,进行对象的读写。 那么在netty中进...
-
9
本文由作者“大白菜”分享,个人博客 cmsblogs.cn,有较多修订和改动。注意:本系列是给IM初学者的文章,IM老油条们还望海涵,勿喷!接上篇《IM系统设计篇》,本篇主要讲解的...
-
7
本文由作者“...
-
4
本文由作者“大白菜”分享,有较多修订和改动。注意:本系列是给IM初学者的文章,IM老油条们还望海涵,勿喷!接上两篇《IM系统设计篇》、《
-
1
本文由作者“大白菜”分享,有较多修订和改动。注意:本系列是给IM初学者的文章,IM老油条们还望海涵,勿喷!前两篇《编码实践篇(单聊功能)》、《
-
17
V2EX › Java 请教 netty 加路由有啥比较好的实践吗
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK