Netty(5)

104 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第26天,点击查看活动详情

channelHandler 的生命周期

  1. handlerAdded() :指的是当检测到新连接之后,调用 ch.pipeline().addLast(new LifeCyCleTestHandler()); 之后的回调,表示在当前的 channel 中,已经成功添加了一个 handler 处理器。
  2. channelRegistered():这个回调方法,表示当前的 channel 的所有的逻辑处理已经和某个 NIO 线程建立了绑定关系,类似我们在Netty 是什么?这小节中 BIO 编程中,accept 到新的连接,然后创建一个线程来处理这条连接的读写,只不过 Netty 里面是使用了线程池的方式,只需要从线程池里面去抓一个线程绑定在这个 channel 上即可,这里的 NIO 线程通常指的是 NioEventLoop,不理解没关系,后面我们还会讲到。
  3. channelActive():当 channel 的所有的业务逻辑链准备完毕(也就是说 channel 的 pipeline 中已经添加完所有的 handler)以及绑定好一个 NIO 线程之后,这条连接算是真正激活了,接下来就会回调到此方法。
  4. channelRead():客户端向服务端发来数据,每次都会回调此方法,表示有数据可读。
  5. channelReadComplete():服务端每次读完一次完整的数据之后,回调该方法,表示数据读取完毕。

实战:使用 channelHandler 的热插拔实现客户端身份校验

在我们先前的身份校验中其实不是挺好,因为这样的逻辑会使得连接后每次发送请求都要校验是否登录,因此我们要把他分割出来进行业务解耦,并且通过channelHandler 的热插拔实现100次发送消息只需要1次登录校验

风暴龙王降临,决战开始

开始仿微信IM实战

我已经在代码出写上注释,可自行查看,

群聊实现‘

需求:

  1. 首先,依然是三位用户依次登录到服务器,分别是闪电侠、极速、萨维塔。
  2. 然后,我们在闪电侠的控制台输入 createGroup 指令,提示创建群聊需要输入 userId 列表,然后我们输入以英文逗号分隔的 userId。
  3. 群聊创建成功之后,分别在服务端和三个客户端弹出提示消息,包括群的 ID 以及群里各位用户的昵称。

群聊的成员管理

  1. 闪电侠先拉逆闪和极速加入了群聊,控制台输出群创建成功的消息。
  2. 随后在萨维塔的控制台输入 "joinGroup" 之后再输入群聊的 id,加入群聊,控制台显示加入群成功。
  3. 在闪电侠的控制台输入 "listGroupMembers" 之后再输入群聊的 id,展示了当前群聊成员包括了极速、萨维塔、闪电侠、逆闪。
  4. 萨维塔的控制台输入 "quitGroup" 之后再输入群聊的 id,退出群聊,控制台显示退群成功。
  5. 最后在闪电侠的控制台输入 "listGroupMembers" 之后再输入群聊的 ID,展示了当前群聊成员已无萨维塔。

心跳和空闲检测

这里的心跳和空闲检测没有给出具体的实现代码,可以自行查阅相关资料进行分析