(2)咚咚客户端核心设计原理分析 - 代码流程篇 (套接字建立,发送消息流程,接收消息流程)
京麦Tcp建立连接流程:
ConnectTask.run() -> connection.connect()(这里面也注册了一个连接状态的一个回调类) -》 tryToConnectOnTracker (建立连接) ——》 选址(根据TbTracker)然后 -》 realconnect -》socket.connect (真正建立连接)
(initconnect 一些初始化的参数,比如 host port 等)
tryToConnectOnTracker.成功连接到->ap-dd1.jd.com:443 (log 打出说明已经建立成功)
初始化 connection 然后在里面添加 读取类和 写入类的监听 (listener.connectionSuccessful(); 回调成功诶说明建立连接成功)
京麦咚咚 - 发送一条消息的流程:sendTxtMessage
FragmentChatting。sendTxtMessage -> ChatMessageSendUtils.sendTextMessage (同时添加item到mChattingMsgAdapter,滑动到item的底部位置)-》 ServiceManager.getInstance().sendMessageChat-》
ServiceManager.sendCommand(本质:NotificationService.startService)->NotificationService.performCommand(intent, command)(这个方法其实在start方法里); -》 NotificationService.doCmdSendPacket -》 NetCoreManager.sendMessage
->NetCoreConnection.sendMessage-》mPacketWriter.sendMessage() -> 调用套接字输入流进行输出
京麦咚咚 - 接收一条消息的流程:
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页面去
咚咚读取一条消息的流程:
(2)咚咚客户端核心设计原理分析 - 代码流程篇 (套接字建立,发送消息流程,接收消息流程)相关推荐
- 图解 DataX 核心设计原理
DataX 是阿里巴巴开源的一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL.Oracle 等).HDFS.Hive.ODPS.HBase.FTP 等各种异构数据源之间稳定高效的数据 ...
- 【OpenGL】二十一、OpenGL 矩阵压栈与出栈 ( 不同类型矩阵变换先后顺序 | 渲染前不设置单位阵 | 压栈出栈原理分析 | 代码示例 )
文章目录 一.不同类型矩阵变换先后顺序 二.渲染前不设置单位阵 三.矩阵的压栈和出栈原理分析 四.矩阵的压栈和出栈代码示例 五.相关资源 一.不同类型矩阵变换先后顺序 对 OpenGL 中的 模型视图 ...
- kafka专题:kafka的总控制器Controller、消费者重分配策略等核心设计原理详解
文章目录 1. Kafka核心总控制器Controller 1.1 核心总控制器Controller的Leader选举 1.2 Partition副本选举Leader机制 2. 消费者消费偏移量off ...
- webpack 原理分析与性能优化(2w字精华)
webpack webpack 最出色的功能之一就是,除了 JavaScript,还可以通过 loader 引入任何其他类型的文件. Webpack 核心概念: Entry(入口):Webpack 执 ...
- Terracotta设计原理分析--(部分内容来自官方描述)
转自:http://yale.iteye.com/blog/1541612 因为工作中历史产品采用了terracotta作为分布式缓存线性扩展平台,因此不得不提前对其原理做了相关了解,当然其中很多的设 ...
- Terracotta设计原理分析
因为工作中历史产品采用了terracotta作为分布式缓存线性扩展平台,因此不得不提前对其原理做了相关了解,当然其中很多的设计思想和oracle.memcached的设计相似,但也有自己的亮点,那就是 ...
- Qt经典蓝牙系列四(经典蓝牙客户端的设计 纯Qt代码) android/windows10
Qt for Bluetooth 蓝牙开发系列文章总纲 文章目录 前言 效果动态图 bluetoothClient定义与构造函数 控制本地开关,并扫描蓝牙设备 与服务器端建立socket连接 与Blu ...
- SFR 原理分析 代码
MTF:REF 在表示相机图像解析力时,通常采用MTF50或者MTF50P. MTF50是当MTF数值下降至最大值的50%时,对应的频率(Cycle Per Pixel),它是一个广泛应用的锐利度衡量 ...
- 光立方原理讲解_基于杠杆平衡的防汛挡水板设计原理分析
图1 近日,微主在"创客焦作"微信公众平台上分享了一款来自瑞典的挡水神器,将这些挡水板彼此拼接在一起,就可以有效地阻挡水流的通过,非常神奇. 创客焦作 来自瑞典的挡水神器 竟然是初 ...
最新文章
- 【Postgresql】触发器某个字段更新时执行,行插入或更新执行
- 看视频笔记1【wpf】
- 最长的可整合子数组的长度
- PHP扩展开发 - 构建第一个PHP扩展
- 安装jdk后出现bash: ./java: /lib/ld-linux.so.2: bad ELF interpreter: 没有那个文件或目录
- python语句join_Python中的join()函数的用法
- 关于端到端通信的讨论(P2P)
- 手机存储不足怎么办?用好这份清理指南你的手机还能再战三年
- PHP Checkbox获取选中项与
- mysql.5.7 linux_mysql 5.7 linux下的安装
- php中explode与split的区别
- AndroidStudio Debug调试使用
- 项目管理工具ShowDoc的部署
- IE提示“Internet Explorer无法打开站点XX,已终止操作”的解决办法
- cisco路由器各接口模块代表的含义是什么
- 【SpringBoot注解-4】:@Target、@Retention、@Documented注解简介
- vmstat命令详解!看了很多vmstat的详解,自己总结的
- 中断优先级和中断线程优先级
- mybatis-Springboot配置多数据源出现错误记录
- 工商银行顾欣:分布式全链路灰度发布的探索与实践