京麦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)咚咚客户端核心设计原理分析 - 代码流程篇 (套接字建立,发送消息流程,接收消息流程)相关推荐

  1. 图解 DataX 核心设计原理

    DataX 是阿里巴巴开源的一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL.Oracle 等).HDFS.Hive.ODPS.HBase.FTP 等各种异构数据源之间稳定高效的数据 ...

  2. 【OpenGL】二十一、OpenGL 矩阵压栈与出栈 ( 不同类型矩阵变换先后顺序 | 渲染前不设置单位阵 | 压栈出栈原理分析 | 代码示例 )

    文章目录 一.不同类型矩阵变换先后顺序 二.渲染前不设置单位阵 三.矩阵的压栈和出栈原理分析 四.矩阵的压栈和出栈代码示例 五.相关资源 一.不同类型矩阵变换先后顺序 对 OpenGL 中的 模型视图 ...

  3. kafka专题:kafka的总控制器Controller、消费者重分配策略等核心设计原理详解

    文章目录 1. Kafka核心总控制器Controller 1.1 核心总控制器Controller的Leader选举 1.2 Partition副本选举Leader机制 2. 消费者消费偏移量off ...

  4. webpack 原理分析与性能优化(2w字精华)

    webpack webpack 最出色的功能之一就是,除了 JavaScript,还可以通过 loader 引入任何其他类型的文件. Webpack 核心概念: Entry(入口):Webpack 执 ...

  5. Terracotta设计原理分析--(部分内容来自官方描述)

    转自:http://yale.iteye.com/blog/1541612 因为工作中历史产品采用了terracotta作为分布式缓存线性扩展平台,因此不得不提前对其原理做了相关了解,当然其中很多的设 ...

  6. Terracotta设计原理分析

    因为工作中历史产品采用了terracotta作为分布式缓存线性扩展平台,因此不得不提前对其原理做了相关了解,当然其中很多的设计思想和oracle.memcached的设计相似,但也有自己的亮点,那就是 ...

  7. Qt经典蓝牙系列四(经典蓝牙客户端的设计 纯Qt代码) android/windows10

    Qt for Bluetooth 蓝牙开发系列文章总纲 文章目录 前言 效果动态图 bluetoothClient定义与构造函数 控制本地开关,并扫描蓝牙设备 与服务器端建立socket连接 与Blu ...

  8. SFR 原理分析 代码

    MTF:REF 在表示相机图像解析力时,通常采用MTF50或者MTF50P. MTF50是当MTF数值下降至最大值的50%时,对应的频率(Cycle Per Pixel),它是一个广泛应用的锐利度衡量 ...

  9. 光立方原理讲解_基于杠杆平衡的防汛挡水板设计原理分析

    图1 近日,微主在"创客焦作"微信公众平台上分享了一款来自瑞典的挡水神器,将这些挡水板彼此拼接在一起,就可以有效地阻挡水流的通过,非常神奇. 创客焦作 来自瑞典的挡水神器 竟然是初 ...

最新文章

  1. 【Postgresql】触发器某个字段更新时执行,行插入或更新执行
  2. 看视频笔记1【wpf】
  3. 最长的可整合子数组的长度
  4. PHP扩展开发 - 构建第一个PHP扩展
  5. 安装jdk后出现bash: ./java: /lib/ld-linux.so.2: bad ELF interpreter: 没有那个文件或目录
  6. python语句join_Python中的join()函数的用法
  7. 关于端到端通信的讨论(P2P)
  8. 手机存储不足怎么办?用好这份清理指南你的手机还能再战三年
  9. PHP Checkbox获取选中项与
  10. mysql.5.7 linux_mysql 5.7 linux下的安装
  11. php中explode与split的区别
  12. AndroidStudio Debug调试使用
  13. 项目管理工具ShowDoc的部署
  14. IE提示“Internet Explorer无法打开站点XX,已终止操作”的解决办法
  15. cisco路由器各接口模块代表的含义是什么
  16. 【SpringBoot注解-4】:@Target、@Retention、@Documented注解简介
  17. vmstat命令详解!看了很多vmstat的详解,自己总结的
  18. 中断优先级和中断线程优先级
  19. mybatis-Springboot配置多数据源出现错误记录
  20. 工商银行顾欣:分布式全链路灰度发布的探索与实践

热门文章

  1. linux禁用CPU 禁用cpu内核
  2. 那个想毁灭人类的机器人要被量产了
  3. 双均线matlab操作,自动交易策略双均线模型测试
  4. 锐浪报表设置指定量空白行的方法
  5. PTA 7-43 快速求和(误差修正版)
  6. PHP 微服务开发框架
  7. php不等于指定数字,php – 为什么bcmul返回的数字与我指定的数字不同?
  8. 如何更改电脑桌面图标大小
  9. smc数显压力表设定方法_smc真空压力表说明书ZSE30ISE30ACN.pdf
  10. Java格式化输出的四种方法