心跳包格式:
{
"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页面去