content: package com.ld.poetry.im.websocket;
  
  import lombok.extern.slf4j.Slf4j;
  import org.springframework.stereotype.Component;
  import org.tio.core.ChannelContext;
  import org.tio.core.intf.Packet;
  import org.tio.websocket.server.WsServerAioListener;
  
  @Component
  @Slf4j
  public class ImServerAioListener extends WsServerAioListener {
  
      /**
       * 建链后触发本方法，注：建链不一定成功，需要关注参数isConnected
       *
       * @param channelContext
       * @param isConnected    是否连接成功,true:表示连接成功，false:表示连接失败
       * @param isReconnect    是否是重连,true:表示这是重新连接，false:表示这是第一次连接
       */
      @Override
      public void onAfterConnected(ChannelContext channelContext, boolean isConnected, boolean isReconnect) throws Exception {
          super.onAfterConnected(channelContext, isConnected, isReconnect);
      }
  
      /**
       * 解码成功后触发本方法
       */
      @Override
      public void onAfterDecoded(ChannelContext channelContext, Packet packet, int packetSize) throws Exception {
          super.onAfterDecoded(channelContext, packet, packetSize);
      }
  
      /**
       * 消息包发送之后触发本方法
       *
       * @param channelContext
       * @param packet
       * @param isSentSuccess  true:发送成功，false:发送失败
       */
      @Override
      public void onAfterSent(ChannelContext channelContext, Packet packet, boolean isSentSuccess) throws Exception {
          super.onAfterSent(channelContext, packet, isSentSuccess);
      }
  
      /**
       * 连接关闭前触发本方法
       */
      @Override
      public void onBeforeClose(ChannelContext channelContext, Throwable throwable, String remark, boolean isRemove) throws Exception {
          super.onBeforeClose(channelContext, throwable, remark, isRemove);
      }
  
      /**
       * 处理一个消息包后
       *
       * @param channelContext
       * @param packet
       * @param cost           本次处理消息耗时，单位：毫秒
       */
      @Override
      public void onAfterHandled(ChannelContext channelContext, Packet packet, long cost) throws Exception {
          super.onAfterHandled(channelContext, packet, cost);
      }
  
      /**
       * 接收到TCP层传过来的数据后
       *
       * @param channelContext
       * @param receivedBytes  本次接收了多少字节
       */
      @Override
      public void onAfterReceivedBytes(ChannelContext channelContext, int receivedBytes) throws Exception {
          super.onAfterReceivedBytes(channelContext, receivedBytes);
      }
  
      /**
       * 服务器检查到心跳超时时，会调用这个函数（一般场景，该方法只需要直接返回false即可）
       *
       * @param channelContext
       * @param interval              已经多久没有收发消息了，单位：毫秒
       * @param heartbeatTimeoutCount 心跳超时次数，第一次超时此值是1，以此类推。此值被保存在：channelContext.stat.heartbeatTimeoutCount
       * @return 返回true，那么服务器则不关闭此连接；返回false，服务器将按心跳超时关闭该连接
       */
      @Override
      public boolean onHeartbeatTimeout(ChannelContext channelContext, Long interval, int heartbeatTimeoutCount) {
          return super.onHeartbeatTimeout(channelContext, interval, heartbeatTimeoutCount);
      }
  }
  