开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第26天,点击查看活动详情
channelHandler 的生命周期
handlerAdded():指的是当检测到新连接之后,调用ch.pipeline().addLast(new LifeCyCleTestHandler());之后的回调,表示在当前的 channel 中,已经成功添加了一个 handler 处理器。channelRegistered():这个回调方法,表示当前的 channel 的所有的逻辑处理已经和某个 NIO 线程建立了绑定关系,类似我们在Netty 是什么?这小节中 BIO 编程中,accept 到新的连接,然后创建一个线程来处理这条连接的读写,只不过 Netty 里面是使用了线程池的方式,只需要从线程池里面去抓一个线程绑定在这个 channel 上即可,这里的 NIO 线程通常指的是NioEventLoop,不理解没关系,后面我们还会讲到。channelActive():当 channel 的所有的业务逻辑链准备完毕(也就是说 channel 的 pipeline 中已经添加完所有的 handler)以及绑定好一个 NIO 线程之后,这条连接算是真正激活了,接下来就会回调到此方法。channelRead():客户端向服务端发来数据,每次都会回调此方法,表示有数据可读。channelReadComplete():服务端每次读完一次完整的数据之后,回调该方法,表示数据读取完毕。
实战:使用 channelHandler 的热插拔实现客户端身份校验
在我们先前的身份校验中其实不是挺好,因为这样的逻辑会使得连接后每次发送请求都要校验是否登录,因此我们要把他分割出来进行业务解耦,并且通过channelHandler 的热插拔实现100次发送消息只需要1次登录校验
风暴龙王降临,决战开始
开始仿微信IM实战
我已经在代码出写上注释,可自行查看,
群聊实现‘
需求:
- 首先,依然是三位用户依次登录到服务器,分别是闪电侠、极速、萨维塔。
- 然后,我们在闪电侠的控制台输入
createGroup指令,提示创建群聊需要输入 userId 列表,然后我们输入以英文逗号分隔的 userId。 - 群聊创建成功之后,分别在服务端和三个客户端弹出提示消息,包括群的 ID 以及群里各位用户的昵称。
群聊的成员管理
- 闪电侠先拉逆闪和极速加入了群聊,控制台输出群创建成功的消息。
- 随后在萨维塔的控制台输入 "joinGroup" 之后再输入群聊的 id,加入群聊,控制台显示加入群成功。
- 在闪电侠的控制台输入 "listGroupMembers" 之后再输入群聊的 id,展示了当前群聊成员包括了极速、萨维塔、闪电侠、逆闪。
- 萨维塔的控制台输入 "quitGroup" 之后再输入群聊的 id,退出群聊,控制台显示退群成功。
- 最后在闪电侠的控制台输入 "listGroupMembers" 之后再输入群聊的 ID,展示了当前群聊成员已无萨维塔。
心跳和空闲检测
这里的心跳和空闲检测没有给出具体的实现代码,可以自行查阅相关资料进行分析