lizhanwei
2020-02-26 e6a06822d4861f4172cdae45dea22a644d175014
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package com.anyun.im_lib;
 
import com.anyun.im_lib.netty.NettyTcpClient;
import com.anyun.im_lib.util.MyLog;
import com.safeluck.aykj.utils.BytesUtils;
 
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.handler.timeout.IdleState;
import io.netty.handler.timeout.IdleStateEvent;
 
/**
 * MyApplication2
 * Created by lzw on 2019/12/4. 11:31:25
 * 邮箱:632393724@qq.com
 * All Rights Saved! Chongqing AnYun Tech co. LTD
 */
public class HeartbeatHandler extends ChannelInboundHandlerAdapter  {
    private NettyTcpClient imsClient;
    public HeartbeatHandler(NettyTcpClient imsClient) {
        this.imsClient = imsClient;
    }
    private HeartbeatTask heartbeatTask;
    private class HeartbeatTask implements Runnable {
 
        private ChannelHandlerContext ctx;
 
        public HeartbeatTask(ChannelHandlerContext ctx) {
            this.ctx = ctx;
        }
 
        @Override
        public void run() {
            if (ctx.channel().isActive()) {
                byte []heartbeatMsg = imsClient.getHeartbeatMsg();
                if (heartbeatMsg == null) {
                    return;
                }
                MyLog.i("发送心跳消息,message=" +  BytesUtils.bytesToHexString(heartbeatMsg) + "当前心跳间隔为:" +imsClient.getHeartbeatInterval() + "ms\n");
                imsClient.sendMsg(heartbeatMsg, false);
            }
        }
    }
    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        super.userEventTriggered(ctx, evt);
        if (evt instanceof IdleStateEvent){
            IdleState state = ((IdleStateEvent)evt).state();
            switch (state){
                case READER_IDLE:
                    // 规定时间内没收到服务端心跳包响应,进行重连操作
                    break;
                case WRITER_IDLE:
                    // 规定时间内没向服务端发送心跳包,即发送一个心跳包
                    if (heartbeatTask == null) {
                        heartbeatTask = new HeartbeatTask(ctx);
                    }
                    imsClient.getLoopGroup().execWorkTask(heartbeatTask);
                    break;
 
            }
        }
    }
}