(3)咚咚客户端核心设计原理分析 - 心跳篇

心跳包格式:

{
    "aid":"Lmk05vqk",  //每次发送消息之后   就会带上这个令牌
    "from":{
        "app":"im.waiter",
        "clientType":"android",
        "pin":"test_pgq"
    },
    "id":"5e66dc1a1c42822010e2d464cf92b9a7",
    "len":0,
    "mid":0,
    "type":"client_heartbeat",
    "ver":"4.1"
}

写线程里面启动一个·

写线程(PacketWriter)里面调用
startKeepAliveProcess(mKeepAliveThread)(启动保活线程,这个线程是保护线程)-》KeepAliveTask (实现了runnable接口) -》 run()(内部是while 死循环,调用sendPackage() 和 Thead.sleep(心跳间隔时间为6s)实现每隔6秒心跳包的发送)   - 》 writePacket(写入套接字的输出流里,不是在消息队列里(这里要说明下:理论上writepackets方法里面有:消息队列mqueue 也是一个 死循环,有点想生产者和消费者模式,等到有消息后就调用writepacket的方法(写入队列里其实调用的是writepackets,但是这里调用的是writePacket方法,因为不需要写入队列里,而是直接发送心跳包)))

和一般消息一样都是按照这样的流程去操作的,实现消息的分发

PackReader.parsePackets()(这里面其实也是一套死循环,去socket读取到缓冲区,然后按照包的开始和终止位置进行makePacket()) - >PackReader.parsePacket()
->AbstractConnection.firePacketReceivedListenersNoFilter-> mPacketListener.processPacket(packet); ->mNetCoreMgr.getCoreModel().processRecvPacket(packet);-> mRecvProcesser.processPacket(packet);(基本上所有的消息都在这里处理)-preprocessPacket()(做一个预处理)intent.putExtra(TcpConstant.SERVICE_BROADCAST_OBJECT1, (Serializable) o1) (发送一个 广播)-》
BaseHelper - onServiceNotifyBroadcast方法中获取收到的消息然后在方法到各个实现了mHelperInterface接口的activity页面去

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值