利用netty框架实现社交软件的聊天功能

网络新闻 3年前 (2022) admin
0

编写自定义处理器

0.先extends SimpleChannelInboundHandler<TextWebSocketFrame>,重写

1.创建用于记录和管理所有客户端channel的channel组

      private static ChannelGroup users =

     1.1当客户端连接服务端之后(打开连接)->获取客户端的channel,并放入ChannelGroup中管理

      @Override

      public void handlerAdded(ChannelHandlerContext ctx) throws Exception {

           users.add(ctx.channel());

     1.2 当触发handlerRemoved,ChannelGroup会自动移除对应客户端的channel

      }

     1.3 发生异常之后关闭连接(关闭channel),随后从ChannelGroup中移除

      @Override

      public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {

           ctx.channel().close();

           users.remove(ctx.channel());

2.根据具体业务添加代码

 

  根据前端传来的不同消息类型执行不同的业务。

         

在此之前应准备两个模型类,用于封装消息

DataContent封装了消息类ChatMsg和消息类型、还有一个扩展字段。

ChatMsg封装了消息的各个变量,包括聊天内容、发送者ID、接收者ID、还有消息ID(用于签收)。

 

  • 如果是websocket第一次open的时候,初始化channel,把用户的channel和userId关联

           这很重要,无论是发送者和接收者,在第一次连接时都会触发这个关联, 用于其他方法获取用户channel。

  • 如果是聊天类型的消息,把聊天记录保存到数据库,同时标记消息的签收状态[未签收]。

          然后发送消息,但在发送前要判断对方是否在线,

          从上一步channel和userId的对应关系中获取到接收方的channel,

          如果没有获取到,则证明对方不在线(没有执行过open类型的请求),推送消息(小米推送,个推)

          如果获取到了,再从ChannelGroup中查找对方的channel是否在其中

          如果没在则证明不在线,推送消息

          如果上述验证通过了,则表明在线,将信息推送至客户端

版权声明:admin 发表于 2022-08-29 12:47:25。
转载请注明:利用netty框架实现社交软件的聊天功能 | 火资源软件