Jack Jiang

我的最新工程MobileIMSDK:http://git.oschina.net/jackjiang/MobileIMSDK
posts - 512, comments - 13, trackbacks - 0, articles - 1

置顶随笔

相关链接:

一、理论知识准备

您需要对鸿蒙Next和ArkTS开发有所了解:

您需要对WebSocket技术有所了解:

HTML5的标准WebSocket协议文档、API手册:

鸿蒙Next的WebSocket文档和手册:

小提示:鸿蒙Next中的WebSocket API跟标准HTML5中的WebSocket接口及用法略有不同,但主要API都能一一对应,相差不大。

二、开发工具准备

1)DevEco-Studio:

JackJiang 使用的版本号如上图所示,为了方便直接引用工程,建议你也使用此版或较新版本

2)一站式下载地址:鸿蒙官网下载地址 点此进入。(需要注册成为开发者才能下载哟!

3)DevEco-Studio效果预览:

三、SDK 文件用途说明

3.1文件概览

纯ArkTS实现,无任何第3方库依赖,更无本地原生代码混编:

MobileIMSDK-鸿蒙端SDK本身只是ets文件源码的集合,自带的Demo代码只是为了方便随时测试SDK代码,目的主要是用于演示SDK的API调用,Demo代码不属于SDK框架的一部分。

大致的目录说明:

3.2详细说明

SDK 各模块/文件作用说明:

四、主要API接口和用途说明

* 主要API文档地址是:http://docs.52im.net/extend/docs/api/mobileimsdk/harmony/

1)ClientCoreSDK.getInstance().loginHasInit:

  • 用途:是否已经完成过首次登陆。
  • 说明 :用户一旦从自已的应用中完成登陆IM服务器后,本方法就会一直返回true(直到退出登陆IM)。
  • 返回值:{boolean},true表示已完成首次成功登陆(即已经成功登陆过IM服务端了,后面掉线时不影响此标识),否则表示尚未连接IM服务器。

2)ClientCoreSDK.getInstance().connectedToServer:

  • 用途:是否在线。
  • 说明 :表示网络连接是否正常。
  • 返回值:{boolean},true表示网络连接正常,否则表示已掉线,本字段只在this._logined=true时有意义(如果都没有登陆到IM服务器,怎么存在在线或掉线的概念呢)。

3)ClientCoreSDK.getInstance().currentLoginInfo:

4)ClientCoreSDK.getInstance().init(eventHub: common.EventHub): void:

  • 用途:初始化SDK核心。
  • 说明:不同于MobileIMSDK的iOS和Java客户端,本方法需要由开发者调用,以确保MobileIMSDK核心已被初始化完成。
  • 本方法被调用后, #isInitialed() 将返回true,否则返回false。

5)ClientCoreSDK.getInstance().release(): void:

  • 用途:保释放MobileIMSDK框架资源统一方法。
  • 说明 :本方法建议在退出登陆(或退出APP时)时调用。调用时将尝试关闭所有MobileIMSDK框架的后台守护线程并同设置核心框架init=false、loginHasInit=false、connectedToServer=false。

6)LocalDataSender.getInstance().sendLogin(loginInfo: PLoginInfo | undefined): number:

  • 用途:发送登陆(连接)信息给服务端。
  • 说明 :不同于其它IM框架,本框架的登录和连接高度封装在了一个sendLogin方法中,无需单独再去connect服务器,大大简化了SDK的使用。loginInfo登陆信息各字段定义见:http://docs.52im.net/extend/docs/api/mobileimsdk/harmony/#1697

7)LocalDataSender.getInstance().sendLoginout(): number:

  • 用途:发送注销登陆信息。
  • 说明:此方法的调用将被本库理解为退出库的使用,本方法将会额外调用资源释放方法 ClientCoreSDK#release() ,以保证资源释放。本方法调用后,除非再次进行登陆过程,否则核心库将处于初始未初始化状态。

8)LocalDataSender.getInstance().sendCommonDataPlain(dataContentWidthStr: string, to_user_id: string, QoS: boolean = true, fingerPrint: string = '', typeu: number = -1): number:

  • 用途:向某人发送一条消息。
  • 参数dataContentWidthStr:要发送的数据内容(字符串方式组织)。
  • 参数to_user_id:要发送到的目标用户id。
  • 参数QoS :true表示需QoS机制支持,否则不需要。
  • 参数fingerPrint:QoS机制中要用到的指纹码(即消息包唯一id),可设为null,生成方法见 Protocal.genFingerPrint()。
  • 参数typeu:应用层专用字段——用于应用层存放聊天、推送等场景下的消息类型。注意:此值为-1时表示未定义。MobileIMSDK框架中,本字段为保留字段,不参与框架的核心算法,专留作应用层自行定义和使用。
  • 返回值:0表示数据发出成功,否则返回的是错误码,see ErrorCode。

9)LocalDataSender.getInstance().sendCommonData(p: Protocal): number:

  • 用途:通用数据协议包的发送根方法。
  • 参数p:{Protocal} 要发送的消息协议包对象,Protocal详情请见“/module/mb_constants.js”下的createCommonData函数说明。
  • 返回值:0表示数据发出成功,否则返回的是错误码,see ErrorCode。

10)SocketEvent.SOCKET_EVENT_ON_RECIEVE_MESSAGE事件通知:

11)SocketEvent.SOCKET_EVENT_ON_LOGIN_RESPONSE事件通知:

  • 用途:本地用户的登陆结果回调事件通知(此事件发生时表示客户端已登陆/连接或重连完成)。
  • 推荐用法:开发者可在此事件中处理登录连接和掉线重连响应反馈。
  • 参数1: {PLoginInfoResponse}:API文档详见:http://docs.52im.net/extend/docs/api/mobileimsdk/harmony/#1434

12)SocketEvent.SOCKET_EVENT_ON_LINK_CLOSE事件通知:

  • 用途:与服务端的通信断开的回调事件通知(此事件发生时表示客户端已掉线)。
  • 该消息只有在客户端连接服务器成功之后网络异常中断之时触发。导致与与服务端的通信断开的原因有(但不限于):无线网络信号不稳定、WiFi与2G/3G/4G/5G等同开情况下的网络切换、手机系统的省电策略等。
  • 推荐用法 :开发者可在此通知中处理掉线时的界面状态更新等,比如设置将界面上的“在线”文字更新成“离线”。

13)SocketEvent.SOCKET_EVENT_PING事件通知:

  • 用途:本地发出心跳包后的回调通知(本回调并非MobileIMSDK-鸿蒙端核心逻辑,开发者可以不需要实现!)。
  • 推荐用法 :开发者可在此回调中处理底层网络的活动情况。

14)SocketEvent.SOCKET_EVENT_PONG事件通知:

  • 用途:收到服务端的心跳包反馈的回调通知(本回调并非MobileIMSDK-鸿蒙端核心逻辑,开发者可以不需要实现!)。
  • 推荐用法 :开发者可在此回调中处理底层网络的活动情况。

15)SocketEvent.SOCKET_EVENT_KICKOUT事件通知:

16)SocketEvent.SOCKET_EVENT_ON_ERROR_RESPONSE事件通知:

17)SocketEvent.SOCKET_EVENT_RECONNECT_ATTEMPT事件通知:

  • 用途:“自动重连尝试中”事件(本回调并非MobileIMSDK-鸿蒙端核心逻辑,开发者可以不需要实现!)。
  • 参数 code :{numeric}:0:已停止,1:持续运行中,2:单次脉搏

18)SocketEvent.SOCKET_EVENT_MESSAGE_LOST事件通知:

  • 用途:消息未送达的回调事件通知。
  • 发生场景:比如用户刚发完消息但网络已经断掉了的情况下,表现形式如:就像手机qq或微信一样消息气泡边上会出现红色图标以示没有发送成功)。
  • 建议用途:应用层可通过回调中的指纹特征码找到原消息并可以UI上将其标记为“发送失败”以便即时告之用户。
  • 参数1:{Array}:由框架的QoS算法判定出来的未送达消息列表。

19)SocketEvent.SOCKET_EVENT_MESSAGE_BE_RECIEVED事件通知:

  • 用途:消息已被对方收到的回调事件通知。
  • 说明 :目前,判定消息被对方收到是有两种可能:1) 对方确实是在线并且实时收到了;2) 对方不在线或者服务端转发过程中出错了,由服务端进行离线存储成功后的反馈(此种情况严格来讲不能算是“已被收到”,但对于应用层来说,离线存储了的消息原则上就是已送达了的消息:因为用户下次登陆时肯定能通过HTTP协议取到)。
  • 建议用途:应用层可通过回调中的指纹特征码找到原消息并可以UI上将其标记为“发送成功”以便即时告之用户。
  • 参数1:{String}:已被收到的消息的指纹特征码(唯一ID),应用层可据此ID找到原先已发的消息并可在UI是将其标记为”已送达“或”已读“以便提升用户体验。

五、如何引入SDK库文件

5.1方法一:源码形式

第一步:先将整个sdk源码module复制到您的鸿蒙工程中:

第二步:配置您的工程,确保正确引用了MobileIMSDK鸿蒙SDK的源码module:

 

5.2方法二:.har包形式

第一步:先将MobileIMSDK鸿蒙端SDK的.har包放入您的鸿蒙Next主module中(比如新建的libs目录下):

第二步:配置您的工程,确保正确引用了MobileIMSDK鸿蒙SDK的.har包:

六、如何调用SDK代码

6.1第一步:设置ws/wss连接URL

设置您自已部署的MobileIMSDK服务端IP或域名的示例详见Demo中的 IMClientManager.ets 文件):

提示:MobileIMSDK的服务端Demo部署指南请见 http://www.52im.net/thread-63-1-1.html

6.2第二步:初始化SDK

调用ClientCoreSDK中的init()方法进行初始化(示例详见Demo中的I MClientManager.ets 文件):

6.3第三步:注册框架事件

注册MobileIMSDK框架级的事件监听(示例详见Demo中的 IMClientManager.ets 文件):

6.4第四步:调用登录方法(框架内部会自动启动connect全过程)

调用登录方法(示例详见Demo中的 LoginPage.ets 文件):

提示:不同于其它IM框架,本框架的登录和连接高度封装在了一个sendLogin方法中,无需单独再去connect服务器,大大简化了SDK的使用。

七、Demo运行效果和功能说明

八、Demo运行方法

8.1重要说明

特别说明:MobileIMSDK的鸿蒙端工程(包括Demo代码),不依赖任何第3方库,也不存在任何Native代码混编,完全使用ArkTS、ArkUI官方标准API实现,所以你在拿到MobileIMSDK的鸿蒙端工程后直接开箱即可运行,切莫搞复杂、不要私自加戏!

8.2配置要连接的MobileIMSDK服务器IP

注意:下图中登陆连接的IP地址请设置为您自已的MobileIMSDK服务器地址哦。

友情提示: MobileIMSDK的服务端该怎么部署就不是本手册要讨论的内容了,你可以参见《即时通讯框架MobileIMSDK的Demo使用帮助:Server端》。

▲ 配置要连接的服务器IP(以上代码详见IMClientManager.ets文件

8.3启动模拟器

注意:如果没有新建模拟器可以自已新建一个。另外也可以使用支持鸿蒙Next的真机,打开“开发者模式”并插入USB线即可使用。

 

▲ 点击绿色箭头,立即启动模拟器!

8.4一键运行

如下图所示,点击绿色“运行”按钮后,将自动在模拟器或真机里显示自带的Demo界面了:

8.5运行效果

1)Demo的登陆界面运行截图:

2)Demo的主界面运行截图:

3)Demo运行的同时,可以查看详细的log输出(方便调试):

九、引用资料

[1] 鸿蒙Next官方开发资料

[2] MobileIMSDK开源框架的API文档

[3] MobileIMSDK开源IM框架源码Github地址点此

[4] MobileIMSDK-鸿蒙Next端发布公告

[5] MobileIMSDK-鸿蒙Next端详细介绍

[6] MobileIMSDK-鸿蒙Next端开发手册* 精编PDF版

[7] MobileIMSDK的Server端Demo使用帮助

posted @ 2024-12-30 12:08 Jack Jiang 阅读(93) | 评论 (0)编辑 收藏

     摘要: 本文的上篇我们讨论了在线实时消息的投递,如果接收方用户B不在线,系统是如何保证离线消息的可达性的呢?这就是本文要讨论的问题。  阅读全文

posted @ 2016-11-18 14:39 Jack Jiang 阅读(3110) | 评论 (0)编辑 收藏

     摘要: 虽然C10K问题已被妥善解决,但对于即时通讯应用(或其它网络编程方面)的开发者而言,研究C10K问题仍然价值巨大,因为技术的发展都是有规律和线索可循的,了解C10K问题及其解决思路,通过举一反三,或许可以为你以后面对类似问题提供更多可借鉴的思想和解决问题的实践思路。而这,也正是撰写本文的目的所在。  阅读全文

posted @ 2016-10-21 16:02 Jack Jiang 阅读(2687) | 评论 (0)编辑 收藏

     摘要: 本文将以新手的视角引导你阅读相关文章,以便为从零开发一个移动端IM做好方方面面的知识准备:包括但不限于网络编程基础、通信协议的选型、IM的架构设计等等。  阅读全文

posted @ 2016-08-29 17:42 Jack Jiang 阅读(3223) | 评论 (0)编辑 收藏

     摘要: 本文将简要介绍TeamTalk开源的过去和现在,为打算研究和采用TeamTalk的同行提供一定程度的参考。  阅读全文

posted @ 2016-08-09 17:25 Jack Jiang 阅读(2859) | 评论 (0)编辑 收藏

     摘要: 本文基于作者的实践以及相关资料的整理,总结了自已对Android进程和Service保活的理解,希望能为你的应用开发带来启发。  阅读全文

posted @ 2016-08-02 22:43 Jack Jiang 阅读(2577) | 评论 (0)编辑 收藏

     摘要: 本文将介绍如何在现有的技术基础上选择合适的方案开发一个“服务器推”(Comet技术)的应用,最优的方案还是取决于应用需求的本身。相对于传统的 Web 应用, 开发 Comet 应用具有一定的挑战性。  阅读全文

posted @ 2016-07-28 11:07 Jack Jiang 阅读(1523) | 评论 (0)编辑 收藏

     摘要: 本文对服务器推送技术(SSE)进行了详细的介绍,包含浏览器端和服务器端的相应实现细节,为在实践中使用该技术提供了指南  阅读全文

posted @ 2016-07-22 18:03 Jack Jiang 阅读(1225) | 评论 (0)编辑 收藏

     摘要: Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询、Comet技术、WebSocket技术、SSE(Server-sent Events)。本文将简要介绍这4种技术的原理,并指出各自的异同点、优缺点等。  阅读全文

posted @ 2016-07-15 15:08 Jack Jiang 阅读(1906) | 评论 (2)编辑 收藏

     摘要: Web端的IM应用,由于浏览器的兼容性以及其固有的“客户端请求服务器处理并响应”的通信模型,造成了要在浏览器中实现一个兼容性较好的IM应用,其通信过程必然是诸多技术的组合,本文的目的就是要详细探讨这些技术并分析其原理和过程。   阅读全文

posted @ 2016-07-12 15:59 Jack Jiang 阅读(5615) | 评论 (0)编辑 收藏

     摘要: 文演示的是一个Android客户端程序,通过UDP协议与两个典型的NIO框架服务端(分别用MINA2和Netty4来实现),实现跨平台双向通信的完整Demo。  阅读全文

posted @ 2016-06-30 16:57 Jack Jiang 阅读(776) | 评论 (0)编辑 收藏

     摘要: 本文将演示一个iOS客户端程序,通过UDP协议与两个典型的NIO框架服务端(将分别用MINA2和Netty4来实现),实现跨平台双向通信的完整Demo。  阅读全文

posted @ 2016-06-28 22:11 Jack Jiang 阅读(1410) | 评论 (0)编辑 收藏

     摘要: 本文是《NIO框架入门》系列文章中的第2篇,将演示的是一个基于MINA2的UDP服务端和一个标准UDP客户端(Java实现)双向通信的完整例子。  阅读全文

posted @ 2016-06-24 14:38 Jack Jiang 阅读(869) | 评论 (0)编辑 收藏

     摘要: 本文将演示的是一个基于Netty4的UDP服务端和一个标准UDP客户端(Java实现)双向通信的完整例子。实际上,Netty4的UDP例子非常难找,官方的代码演示里只有一个简单的UDP广播例子,不足以用于演示Netty4的UDP通信最佳实践。  阅读全文

posted @ 2016-06-20 14:48 Jack Jiang 阅读(1540) | 评论 (0)编辑 收藏

     摘要: MobileIMSDK是一套专为移动端开发的原创即时通讯框架:超轻量级、高度提炼,lib包50KB以内;完全基于UDP协议实现;客户端支持iOS、Android、标准Java平台;可应用于跨设备、跨网络的聊天APP、企业OA、消息推送等各种场景。  阅读全文

posted @ 2015-12-14 15:18 Jack Jiang 阅读(2798) | 评论 (0)编辑 收藏

     摘要: MobileIMSDK是专为移动端开发的原创即时通讯开源框架:超轻量级、高度提炼,lib包50KB以内;完全基于UDP协议实现;客户端支持iOS、Android、标准Java平台;可应用于跨设备、跨网络的聊天APP、企业OA、消息推送等各种场景。  阅读全文

posted @ 2015-12-01 16:06 Jack Jiang 阅读(3406) | 评论 (2)编辑 收藏

2025年9月4日

为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第46 期。

[- 1 -] 微信团队原创分享:Android版微信的臃肿之困与模块化实践之路

[链接] http://www.52im.net/thread-893-1-1.html

[摘要] 本文讲述微信 Android 版架构从分层到多进程、模块化的演进,及因代码膨胀重构模块化的过程与效果。


[- 2 -] 微信后台团队:微信后台异步消息队列的优化升级实践分享

[链接] http://www.52im.net/thread-801-1-1.html

[摘要] 本文分享了该组件2.0版本的功能特点及优化实践,希望能为类似业务(比如移动端IM系统等)的消息队列设计提供一定的参考。


[- 3 -] 微信团队原创分享:微信客户端SQLite数据库损坏修复实践

[链接] http://www.52im.net/thread-789-1-1.html

[摘要] 本文介绍微信客户端 SQLite 数据库损坏的原因,及优化空间占用、文件 sync 和备份 master 表以提升修复率的实践。


[- 4 -] 腾讯原创分享(一):如何大幅提升移动网络下手机QQ的图片传输速度和成功率

[链接] http://www.52im.net/thread-675-1-1.html

[摘要] 本文内容是由腾讯TMQ专项测试团队针对手机QQ图片上传速度和成功率问题,在各种复杂移动网络环境下的优化实践总结和整理而成。文章虽是针对手机QQ图片上传这一特定业务功能,但内容中大量涉及复杂移动网络环境下无线网络的特性、特点以及相关第一手测试数据,都是非常珍贵的,尤其值得移动端IM开发、消息推送这种深度依赖移动网络的应用开发者借鉴和参考。


[- 5 -] 腾讯原创分享(二):如何大幅压缩移动网络下APP的流量消耗(上篇)

[链接] http://www.52im.net/thread-696-1-1.html

[摘要] 该文讲述腾讯某产品因用户投诉背景流量高,经测试分析,通过优化将 24 小时流量降至 100KB 以下的过程。


[- 6 -] 腾讯原创分享(三):如何大幅压缩移动网络下APP的流量消耗(下篇)

[链接] http://www.52im.net/thread-697-1-1.html

[摘要] 本篇中将详细介绍我们的具体分析方法和实践优化思路,以及在优化过程中总结出来的法则等。


[- 7 -] 如约而至:微信自用的移动端IM网络层跨平台组件库Mars已正式开源

[链接] http://www.52im.net/thread-684-1-1.html

[摘要] 微信Mars到底有什么用呢?毫无疑问,微信Mars存在的前提就是为了更好的服务微信这个超级IM而存在,最适合干的活就是开发移动端IM了,当然由于提炼的很好,相信移动端推送技术等都是可以使用微信Mars作为网络层lib来使用,从而以微信的成果为起点开发出拥有更加优秀网络体验的移动端富网络应用。


[- 8 -] 微信Mars:微信内部正在使用的网络层封装库,即将开源

[链接] http://www.52im.net/thread-620-1-1.html

[摘要] 该文介绍微信 Mars 网络层封装库即将开源,涵盖其模块构成、特点、源起及跨平台开发经验。


[- 9 -]  开源libco库:单机千万连接、支撑微信8亿用户的后台框架基石 [源码下载]

[链接] http://www.52im.net/thread-623-1-1.html

[摘要] 该文介绍微信于 2013 年开源的 libco 库,其特性、背景、技术架构及对微信后台并发能力的提升作用。


[- 10 -] 微信新一代通信安全解决方案:基于TLS1.3的MMTLS详解

[链接] http://www.52im.net/thread-310-1-1.html

[摘要] 本文将详细介绍基于TLS 1.3的微信新一代通信安全协议mmtls。


[- 11 -] 微信团队原创分享:Android版微信后台保活实战分享(进程保活篇)

[链接] http://www.52im.net/thread-210-1-1.html

[摘要] 该文分享 Android 版微信进程保活实战,包括进程拆分、及时拉起及利用前台服务提升进程优先级等方案。


[- 12 -] 微信团队原创分享:Android版微信后台保活实战分享(网络保活篇) 

[链接] http://www.52im.net/thread-209-1-1.html

[摘要] 该文分享 Android 版微信网络保活实战,包括长连接心跳机制、动态心跳策略及保证消息实时的 notify 机制等。


[- 13 -] Android版微信从300KB到30MB的技术演进(PPT讲稿) [附件下载]

[链接] http://www.52im.net/thread-206-1-1.html

[摘要] ANDROID系统先天的弊端与产品需求研发过程的矛盾,推动着客户端架构演进史。这架车轮不断向前滚动,不断调整进化的架构,在为微信未来的高速成长保驾护航。我们一起来了解微信ANDROID客户端的架构演进过程。


[- 14 -] 微信团队原创分享:Android版微信从300KB到30MB的技术演进

[链接] http://www.52im.net/thread-205-1-1.html

[摘要] 该文讲述 Android 版微信从 300KB 到 30MB 的技术演进,分拓荒、成长、变革、进化、开放五阶段,介绍架构调整与问题解决。


[- 15 -] 如何解读《微信技术总监谈架构:微信之道——大道至简》

[链接] http://www.52im.net/thread-201-1-1.html

[摘要] 该文解读微信技术总监演讲,介绍微信以 “敏捷” 为核心,通过拆分系统、基础组件、监控等实现快速迭代与稳定服务。


👉52im社区本周新文:转转客服IM系统的WebSocket集群架构设计和部署方案,欢迎阅读!👈

我是Jack Jiang,我为自已带盐!https://github.com/JackJiang2011/MobileIMSDK/

posted @ 2025-09-04 12:59 Jack Jiang 阅读(12) | 评论 (0)编辑 收藏

2025年8月28日

1、引言

网络ping不通是网络中出现频率最高的故障之一,同时也是最让人抓狂的故障,谁没遇到过?今天就和你细说下ping不通的原因,看看能不能和你遇到的情况对上号。

技术交流:

cover-opti

- 移动端IM开发入门文章:《新手入门一篇就够:从零开发移动端IM

本文已同步发布于:http://www.52im.net/thread-4857-1-1.html

2、系列文章

本文是系列文章中的第 20篇,本系列文章的大纲如下:

3、ping命令技术原理

了解ping命令原因,我们来通过一个实例来了解。

假定主机A的IP地址是 192.168.1.1 ,主机B的IP地址是 192.168.1.2 ,都在同一子网内,则当你在主机A上运行“Ping 192.168.1.2”后,都发生了些什么呢?

首先:Ping命令会构建一个固定格式的ICMP请求数据包,然后由ICMP协议将这个数据包连同地址“192.168.1.2”一起交给IP层协议(和ICMP一样,实际上是一组后台运行的进程)。

IP层协议将以地址“192.168.1.2”作为目的地址,本机IP地址作为源地址,加上一些其他的控制信息,构建一个IP数据包。并在一个映射表中查找出IP地址192.168.1.2所对应的物理地址(也叫MAC地址,这是数据链路层协议构建数据链路层的传输单元帧所必需的),一并交给数据链路层。

后者构建一个数据帧,目的地址是IP层传过来的物理地址,源地址则是本机的物理地址,还要附加上一些控制信息,依据以太网的介质访问规则,将它们传送出去。

1

主机B收到这个数据帧后,先检查它的目的地址,并和本机的物理地址对比,如符合则接收,否则丢弃。接收后检查该数据帧,将IP数据包从帧中提取出来,交给本机的IP层协议。

同样:IP层检查后,将有用的信息提取后交给ICMP协议,后者处理后,马上构建一个ICMP应答包,发送给主机A,其过程和主机A发送ICMP请求包到主机B一模一样。

直接说:就是利用网络上机器IP地址的唯一性,给目标IP地址发送一个数据包,再要求对方返回一个同样大小的数据包来确定两台网络机器是否连接相通,时延是多少。

上面的过程就是ping命令的原理:主机A收到了主机B的一个应答包,说明两台主机之间的去、回通路均正常,但也并不是所有网络都是正常的,下面我们来看ping不通的原因。

4、同网段ping不通的原因概述

ping命令不通,主要有两种情况:

  • 1)同网段内的ip地址ping不通;
  • 2)不同网段的ip地址ping不通。

各个情况不一样,我们首先来看同网段ping不通的两种情况。

5、同网段ping不通的情况1:“无法访问目标主机”

目的ip和源ip是同一网段的,ping的结果是“无法访问目标主机”,属于ping的请求没有发出。

我们来看下,ping同网段不存的ip地址:

2

ping的请求发出后,返回显示“无法访问目标主机"。

什么原因呢?说明此时ping的需求并没有成功发出。

这时要检查:

  • 1)对方是否开机?ip是否存在?
  • 2)有跨交换机vlan的话,检查对应的中间trunk链路是否导通?
  • 3)走直连路由是否正确?是否应该走默认路由,而走了直连路由;
  • 4)子网掩码是否错误;
  • 5)默认网关是否填写正确。

6、同网段ping不通的情况2:“超时(time out)”

目的ip和源ip是同一网段的,ping的结果是“超时或者time out” ,属于ping的请求已经成功发出了,但目标主机没有回复。

ping的请求发出后,返回显示“超时":

3

什么原因呢?这种情况是ping已经成功发出了,到达了主机,但是没有得到响应

要检查:

  • 1)检查下防火墙,防火墙禁止了对ping的回应;
  • 2)子网掩码的设置错误,导致不在同一个网段;
  • 3)设备硬件故障,导致设备没有对应的mac地址,无法生成路由表,而走默认路由;
  • 4)ip冲突,或ip地址与直联路由不在同一个网段;
  • 5)网关没有设置好。

7、 跨网段ping不通的原因概述

不同网段ping不通,通常的表现有“无法访问目标主机”、“time out”,但具体分析起来其实可能的原因是比较多的,我们还是一起来看下跨网段常见的原因吧。

8、 跨网段ping不通的情况1:“无法访问目标主机”

跨网段出现无法访问目标主机,说明请求没有成功发出,获取不了目的ip地址与mac地址。

4

可能出现的原因是:

  • 1)目的ip地址不存在;
  • 2)检查路由表是否有缺省的路由;
  • 3)检查arp表是否有网关的mac地址;
  • 4)有网关设置错误;
  • 5)走了默认路由。

9、 跨网段ping不通的情况2:“time out”

若显示 time out,表示 ping 的 request 消息已经发出,目的ip的网关已经获取到目的ip的mac地址,但是目的主机没有回复,或源主机无法收到。

这些应该检查回程路由和节点回程路由。

5

可能的原因有:

  • 1)检查下防火墙,是否拦截了ping的请求消息;
  • 2)检查经过节点的路由是否正确,或者是否有回程路由;
  • 3)回程路由的硬件网卡出口和ping的request的入口网卡不是同一个;
  • 4)交换机vlan对应的接口全部down了,导致vlan状态down,vlan的对应路由没有生成。

10、本文小结

当我们网络ping不通时,首先要看ping显示的结果是”无法访问目标主机“还是”超时“,再看是同网段,还是不同网段,采取相应的分析方法。

另外在分析与解决网络故障时,我们要熟练的了解ping、arp、tracert、route这几个命令的用法,可以快速的定位ping不通的原因。

尤其是这arp、tracert、route这三个命令的用法,解决故障非常方便。

11、参考资料

[1] 史上最通俗的集线器、交换机、路由器功能原理入门

[2] 通俗讲解,有了IP地址,为何还要用MAC地址?

[3] 外行也能读懂的网络硬件设备功能原理速成

[4] 每天都在用的Ping命令,它到底是什么?

[5] 能Ping通,TCP就一定能连接和通信吗?

[6] 什么是公网IP和内网IP?NAT转换又是什么鬼?

[7] 假如你来设计网络,会怎么做?

[8] 你真的了解127.0.0.1和0.0.0.0的区别?

[9] 一文搞懂localhost和127.0.0.1

[10] 深入操作系统,彻底搞懂127.0.0.1本机网络通信

[11] 冰山之下,一次网络请求背后的技术秘密

[12] 得物自研移动端弱网诊断工具的技术实践分享


(本文已同步发布于:http://www.52im.net/thread-4857-1-1.html)

posted @ 2025-08-28 11:51 Jack Jiang 阅读(24) | 评论 (0)编辑 收藏

2025年8月20日

1、基本介绍

1

RainbowTalk是一套基于开源即时通讯讯IM框架 MobileIMSDK 的产品级鸿蒙NEXT端IM系统。纯ArkTS编写、全新开发,没有套壳、也没走捷径,每一行代码都够“纯血”。与姊妹产品RainbowChatRainbowChat-Web 技术同源,历经考验。

☞ 详细介绍:http://www.52im.net/thread-4822-1-1.html
☞ 运行截图:http://www.52im.net/thread-4824-1-1.html (运行视频
☞ 下载体验:http://www.52im.net/thread-4825-1-1.html

2、MobileIMSDK开源工程

2

MobileIMSDK 是一套专门为移动端开发的开源IM即时通讯框架,超轻量级、高度提炼,一套API优雅支持UDP 、TCP 、WebSocket 三种协议,支持iOS、Android、H5、小程序、Uniapp、标准Java平台,服务端基于Netty编写。

工程同步开源地址:

开源仓库目录说明:

 proj_dir

MobileIMSDK框架由以下部分组成:

 3

MobileIMSDK框架的架构原理图:

4

v2.4 版更新内容

此版更新内容更多历史更新日志):

  • 1)[优化] 解决了聊天界面中语音消息下载、图片消息上传时消息气泡ui会闪烁的问题;
  • 2)[优化] 解决深色模式下聊天消息文字看不清的问题;
  • 3)[新增] 新增了大文件消息(支持断点续传、下载、查看文件内容等)。

部分新增功能运行截图(更多截图运行视频):

6

posted @ 2025-08-20 10:14 Jack Jiang 阅读(31) | 评论 (0)编辑 收藏

2025年8月19日

1、基本介绍

RainbowChat是一套基于MobileIMSDK通信框架的产品级移动端IM系统。RainbowChat源于真实运营的产品,不同于市面上某些开源或淘宝售卖的demo级代码,RainbowChat的产品前身已被成千上万真实的客户使用过,解决了大量的屏幕适配、细节优化、机器兼容问题。

RainbowChat可能是市面上唯一一款同时支持TCP、UDP两种通信协议的全源码IM产品(且核心通信层也是自主开发的)。RainbowChat是RainbowChat-Web 和鸿蒙NEXT产品RainbowTalk 的姊妹产品。

2、品质说明

❶ 源自真正运营的商业产品:RainbowChat的技术源于真实运营的商业产品。

❷ 它不是个Demo:不同于市面上某些开源或淘宝的demo级代码,RainbowChat已被成千上万真实的客户使用过,解决了大量的屏幕适配、细节优化、机器兼容问题。

❸ 简洁、精炼、优化、原生:
RainbowChat为了最小化开发者2次开发时的兼容性、可读性、可维护性难度,把框架的依赖、工具的依赖、各种库版本的依赖、运行环境的依赖都尽最大努力降到最低,极大降低开发者的开发环境和部署环境搭建的成本,达到最简洁、最精炼的目标。

* 截止目前:RainbowChat已全面深度适配最新Android系统,确保更佳的用户体验效果。

3、运行演示与安装体验

❶ 运行截图,详见:《Android端全部功能截图iOS端全部功能截图
❷ 下载体验,详见:《RainbowChat下载体验

4、功能简介

1、支持文本消息、语音留言消息、图片消息、大文件消息(支持断点续传)、短视频消息、个人名片、群名片、位置消息、Emoji表情、消息撤回、消息转发、消息引用、“@”功能、“扫一扫”功能等;
2、支持一对一陌生人聊天模式;
3、支持一对一正式好友聊天模式;
4、支持多对多群聊聊天模式,且自动防刷屏(仅限专业版)
5、完善的群组信息管理:建群、退群、解散、转让、邀请、踢人、群公告等 (仅限专业版)
6、完整的注册、登陆、密码找回等功能闭环;
7、个人中心功能:改基本信息、改个性签名、改头像、改密码等;
8、支持个人相册、个人语音介绍;
9、完整的礼物发送和积分管理子系统;
10、完整的离线消息/指令拉取机制;
11、完整的本地消息/指令缓存机制,节省网络流量;
12、完整的富媒体文件(语音、大文件、图片、短视频)缓存机制,节省网络流量;
13、完整的好友关系管理:查找好友、发出请求、处理请求、删除好友、好友备注等;
14、全功能实时语音聊天(完全自主开发,现在就可体验);
15、全功能实时视频聊天(完全自主开发,现在就可体验);
16、内置一完整“商城”模块,目前仅用于演示产品的完整性;
17、其它未提及的功能和特性请自行下载体验。

RainbowChat线上版本目前仅作演示和研究之用,运行环境配置最小化(仅1核1G和1MB带宽),请客观评估。

5、技术亮点 

1)持续打磨和升级至今(历经时间考验和大量客户面辐射的代码,可靠性、兼容性一定优于短时间内堆砌功能的产品);
2)底层算法库到上层功能,完全自主开发,技术资产可控;
3)同时支持TCP、UDP两种通信协议(可能是市面上能买到的唯一一款);
4)独有的UDP协议支持, 能更好地适应卫星网、移动弱网、嵌入式物联网等场景;
5)即时通讯核心层基于MobileIMSDK 工程,保证了业务代码与通信核心的高度分层(经验不足的IM产品是做不到这一点的);
6)支持完整的消息送达保证(QoS)机制,保证送达率,理论丢包率约为0.0001%;
7)独有的UDP协议无连接特性保证在高延迟、跨洲际、不同网络制式的恶恶劣环境中能稳定、可靠地运行;
8)基于 MobileIMSDK 工程的自有协议,未来的流量压缩对于APP端的节电控制和流量控制、服务端的网络吞吐等都有完全的控制能力;
9)完善的网络状况自动检测、断网重连等服务自动治愈能力;
10)核心算法和实现均为自主原创(历经8年,并非开源拼凑),保证了技术的持续改进、升级、扩展;
11)聊天协议兼容:实现了与RainbowChat-Web产品、鸿蒙NEXT产品RainbowTalk完全兼容的协议模型;
12)消息收发互通:实现了与RainbowChat-Web产品、鸿蒙NEXT产品RainbowTalk的无缝消息互通。

6、注册、登录和“个人中心”等

 

7、好友聊天功能

8、实时语音聊天功能

9、实时视频聊天功能

10、群聊功能

 

11、视频消息功能

12、位置消息功能

13、“大文件”消息(支持断点续传)

 

14、“扫一扫”功能

15、“搜索”功能

16、消息转发功能

17、消息引用功能

18、“@”功能

posted @ 2025-08-19 14:17 Jack Jiang 阅读(30) | 评论 (0)编辑 收藏

2025年8月14日

     摘要: 本文引用了后台技术汇一枚少年郎“大模型应用之:SSE流式响应”的内容,下文有修订和重新排版。1、引言文章介绍了SSE(Server-Sent Events)技术在大模型流式响应中的应用,包括其发展历程、ChatGPT流式输出原理、SSE技术特点及与WebSocket的对比,并提供了两种流式响应落地方案。* 相关阅读:《全民AI时代,大模型客户端和服务端的实时通信到...  阅读全文

posted @ 2025-08-14 14:31 Jack Jiang 阅读(47) | 评论 (0)编辑 收藏

2025年8月7日

     摘要: 本文由携程技术Butters分享,原题“干货 | 日均流量200亿,携程高性能全异步网关实践”,下文有修订和重新排版。1、引言本文分享的是携程API网关全异步改造的实践分享,包括从Zuul 1.0同步架构升级为基于Netty的全异步架构,通过RxJava实现业务流程异步化,结合流式转发、ZGC等技术显著提升性能,并构建控制面实现多协议统一治理与模块化编排。 &nb...  阅读全文

posted @ 2025-08-07 12:01 Jack Jiang 阅读(54) | 评论 (0)编辑 收藏

2025年7月24日

本文由转转平台业务负责人王计宽分享,原题“转转push系统的演进之路”,下文有修订和重新排版。

1、引言

顾名思义,push就是就是借助厂商通道把消息发送给用户的一种方式,一般用于用户的召回和活动触达,和即时通讯IM在业务上稍有区别,但技术逻辑上是相通的,不在此处赘述。

本文将从0开始讲讲转转千万级用户量消息推送系统的架构演进和迭代过程,以及遇到的常见问题的解法,希望能带给你启发。

 
 

2、术语解释

以下是本文涉及到的一些技术术语的解释:

  • 1)业务属性:运营、业务、功能类推送;
  • 2)推送范围: 月活、全量、定向推送、个性化推送;
  • 3)目标端:一般是安卓、ios客户端;
  • 4)通道:小米、华为、魅族、apns等手机厂商的常驻连接;
  • 5)token: 用于设备的唯一标识,由APP本身生成;
  • 6)devicetoken:用于推送的唯一标识,一般由厂商提供;
  • 7)推送量:推送消息的数量;
  • 8)到达率:消息到达手机的数量/推送量;
  • 9)点击率:用户点击量/推送量。

3、当前架构概览

现有的架构支持后台推送、业务推送以及个性化推荐推送。

以下是相关推送业务的特点:

  • 1)后台推送:一般会有标准的格式,特点是时间短、推送量大,比如8点秒杀活动;
  • 2)业务推送 :一般都是业务触发,特点是实时性强、优先级高,如订单支付消息;
  • 3)个性化推送:经常会和用户画像相关,特点是策略复杂、内容多样,需要有风控管理,如猜你喜欢等推荐策略。

4、技术背景——PM想推送运营活动

步骤:

  • 1)PM从大数据平台上导出一部分用户集合;
  • 2)RD写程序调用push接口。

问题:

  • 1)N个PM都有需求,RD..........;
  • 2)8点有一个突发情况,9点来一波;
  • 3)每周末都要活动,推送。

解决方案:

  • 1)搭建一个后台,支持根据用户ID上传,解放开发资源;
  • 2)支持按照时间推送,支持文案可配;
  • 3)支持安卓、IOS分端推送。

遗留的问题:PM上传了一个浏览过手机类目用户的数据集合,数据量太大,上传超时。PS:用户量大概在1000w左右+,大约300M左右的文件。

提示:

  • 1)上传的时间大约在1分钟左右, 需要联系运维设置最长的链接时间,否则nginx会主动断开;
  • 2)上传由同步上传,改成进度条的方式,让上传者可以看到进度;
  • 3)上传和数据处理分开(我们当时是边上传,边解析文件比较慢)。

5、希望重大节日能够即时通知到活跃用户

5.1 实时推

问题描述:重大节日,推送全量用户、月活、周活数据,每次仅是文案不同,PM都需要跑大数据系统,效率太低,当天数据不可获得,平均推送需要1个多小时。

要求:

  • 1)1亿的数据能够在一小时内推送完毕;
  • 2)要覆盖到某一个周期内的用户(比如一个月);
  • 3)支持预览,支持暂停。

分析-数据量(以2000w月活为例):

  • 1) 全量用户认定为近3个月(90天)内访问过转转的用户;
  • 2) 预估所有设备数量在5000w左右;
  • 3) 预计占用的空间为5G。

分析-性能(以2000w月活为例):

  • 1) 老系统push的平均QPS是2000;
  • 2) 2000W/2000/60/2=83~=1小时20分钟,希望能够在12分钟内推送完毕(一个小时推送1亿的指标)。

难点分析:

  • 1) 数据做到准实时,怎么算准实时;
  • 2)2000千万的数据12分钟内推送完毕,QPS~=2.7w, 如何让性能提升13.5倍(2k提升到2.7w的并发)。

解决方案:

  • 1) 数据的准实时:实时接收kafka日志消息,每分钟把清洗的数据进行合并;
  • 2)需要存储的数据要素:用户的token信息(注意不是devicetoken);此token的活跃时间(时间戳);
  • 3)用户数据存储选型。

最终选择redis的zset进行存储。

5.2 如何提高发送性能

首先分析之前之所以慢的原因:

  • 1) 单线程发送;
  • 2) 受到厂商通道的限制,单接口耗时100ms+(IOS通道)。

解决方案:

  • 1)区分安卓、IOS单独发送,原始程序只负责从redis拿到数据后拼装成固定结构(简单拼接操作速度很快);
  • 2)把数据推送到MQ中(可以不用MQ吗?);
  • 3)多个消费订阅者,进行消费(容易扩展),通过厂商 通道推送出去。

注意:iOS通道,我们用的pushy开源工具,特定情况下无法持续推送消息,需要定时检查,重新创建通道。

最后的效果:push推送的QPS达到3w+,推送能力提升的同时,也引发了以下问题。

5.3 业务服务器扛不住瞬时流量

问题描述:当push的推送能力上去了之后, 用户的瞬时访问问题随之而来

  • 1)瞬时的流量高峰,导致超时增多;
  • 2)部分请求到达性能瓶颈,超时增多,页面打不开~,见下图。

push落地效果:

解决办法:

  • 1)最简单的办法:加机器;
  • 2)业务接口多线程、服务治理,消峰(ratelimit);
  • 3)app核心功能增加缓存,保证不会出现白屏的情况;
  • 4)减少活动路径。(一般push都会落地到某一个活动页面。但是正常打开push,都会先进入首页,在跳转到活动页面。给push的消息增加特殊埋点,如果是此类push消息,就直接 跳转到特定页面,减少中间环节。)

6、AB实验室

问题描述:有一天晚上9点推送了一个运营类的push,发现居然点击率超级高,是文案优秀?还是流量高峰?

要求:存在多个推送文案,系统能够择优选择点击率最好的进行推送?

解决方式:加入AB测的能力,先进行少量用户推送,根据AB的效果,择优推送.

7、整合全部手机厂商级ROOM推送通道

新的问题:之前安卓的通道我们仅有小米通道+个推(个推达到率一般,做托底), 如果我们向华为手机推送消息,也是通过小米通道是很难到达的。

要求:

  • 1)希望能够把大厂的厂商通道都接进来;
  • 2)推送的消息能够根据用户最后登录的通道进行优化推送;
  • 3)速度不能慢下来。

解决方式:

  • 1) 搭建tokens服务,能够批量判定devicetoken的最后使用的厂商(需要依赖转转客户端上报);
  • 2) 分库分表的方式进行存储;
  • 3) 数据热备到缓存中。

效果:当年统计能够提高10%的达到率。

8、消息送达监控

一般的监控维度包含:

  • 1)产品线:转转、找靓机等等;
  • 2)客户端:安卓、IOS;
  • 3)指标:发送、到达、点击的数量和比例;
  • 4)数据对比:模板、周期;
  • 5)通道:小米、华为、vivo、apns。

9、 本文小结

现状:

  • 1) 推送月活10分钟;
  • 2) 支持暂停、预览,实时查看推送数据量;
  • 3) 支持提前AB看效果;
  • 4) 支持不在线,微信通知;
  • 5) 支持防打扰;
  • 6) 支持优先级和厂商高优通道。

提高速度:预加载+缓存+多线程+合理的数据结构+批量处理+合理布局+特殊埋点。

折中方案:异步上传、限流控制、降级处理、分层解耦、补偿通知。

10、 参考资料

[1] 极光推送系统大规模高并发架构的技术实践分享

[2] 魅族2500万长连接的实时消息推送架构的技术实践分享

[3] 专访魅族架构师:海量长连接的实时消息推送系统的心得体会

[4] 基于WebSocket实现Hybrid移动应用的消息推送实践(含代码示例)

[5] 一个基于长连接的安全可扩展的订阅/推送服务实现思路

[6] 实践分享:如何构建一套高可用的移动端消息推送系统?

[7] Go语言构建千万级在线的高并发消息推送系统实践(来自360公司)

[8] 腾讯信鸽技术分享:百亿级实时消息推送的实战经验

[9] 京东京麦商家开放平台的消息推送架构演进之路

[10] 技术干货:从零开始,教你设计一个百万级的消息推送系统

[11] 爱奇艺WebSocket实时推送网关技术实践

[12] 喜马拉雅亿级用户量的离线消息推送系统架构设计实践

[13] 消息推送技术干货:美团实时消息推送服务的技术演进之路

[14] 揭秘vivo百亿级厂商消息推送平台的高可用技术实践

[15] 得物从零构建亿级消息推送系统的送达稳定性监控体系技术实践

[16] B站千万级长连接实时消息系统的架构设计与实践

(本文已同步发布于:http://www.52im.net/thread-4852-1-1.html)

posted @ 2025-07-24 15:58 Jack Jiang 阅读(58) | 评论 (0)编辑 收藏

2025年7月16日

     摘要: 本文由GSYTech 恋猫de小郭分享,原题“2025 跨平台框架更新和发布对比,这是你没看过的全新版本”,下文有修订和重新排版。1、前言2025 年可以说又是一个跨平台的元年,其中不妨有鸿蒙Next平台刺激的原因,也有大厂技术积累“达到瓶颈”的可能,又或者“开猿截流、降本增笑”的趋势的影响,2025 年上半年确实让跨平台框架...  阅读全文

posted @ 2025-07-16 10:28 Jack Jiang 阅读(68) | 评论 (0)编辑 收藏

2025年7月9日

1、基本情况

RainbowTalk是一套基于MobileIMSDK的产品级鸿蒙NEXT端IM系统,目前已正式发布。纯ArkTS、从零编写,无套壳、没走捷径,每一行代码都够“纯”(详见:《RainbowTalk详细介绍)。

MobileIMSDK是一整套开源IM即时通讯框架,历经10年,超轻量级、高度提炼,一套API优雅支持 UDP 、TCP 、WebSocket 三种协议,支持 iOS、Android、H5、标准Java、小程序、Uniapp、鸿蒙NEXT,服务端基于Netty编写。

MobileIMSDK工程的开源地址是:

2、功能简介

1)支持文本消息、语音留言消息、图片消息、大文件消息(支持断点上传)、短视频消息、个人名片、群名片、Emoji表情、消息撤回、消息转发、消息引用、“@”功能、“扫一扫”功能等;
2)支持一对一陌生人聊天模式;
3)支持一对一正式好友聊天模式;
4)支持多对多群聊聊天模式;
5)完善的群组信息管理:建群、退群、解散、转让、邀请、踢人、群公告等;
6)完整的注册、登陆(同时支持手机验证码登录和密码登录)、密码找回等功能闭环;
7)个人中心功能:改基本信息、改个性签名、改头像、改密码等;
8)支持个人相册查看;
9)完整的离线消息/指令拉取机制;
10)完整的本地消息/指令缓存机制,节省网络流量;
11)完整的富媒体文件(语音、大文件、图片、短视频)缓存机制,节省网络流量;
12)完整的好友关系管理:查找好友、发出请求、处理请求、删除好友、好友备注等;
13)其它未提及的功能和特性请自行下载体验

RainbowTalk线上版本目前仅作演示和研究之用,运行环境配置最小化(仅1核1G和1MB带宽),请客观评估。

3、登陆和注册等

4、首页等主要界面

5、“我的”、“个人中心”等页面

6、好友关系等

7、陌生人聊天

8、好友聊天

9、世界频道聊天

10、群聊和群管理

11、大文件消息

12、短视频消息

13、“个人名片”消息

14、“群名片”功能

15、“扫一扫”功能

16、“搜索”功能

17、“消息转发”功能

18、“消息引用”功能

19、“@”功能

20、“消息撤回”功能

 

本文内容引用自:http://www.52im.net/thread-4822-1-1.html

posted @ 2025-07-09 11:27 Jack Jiang 阅读(51) | 评论 (0)编辑 收藏

2025年6月26日

本文由字节跳动张华挺分享,原题“你不知道的前端音视频知识”,下文有修订和重新排版。

1、前言

本文回顾了Web端音视频的发展历程,同时还介绍了视频的编码、帧率、比特率等概念,提到了Canvas作为视频播放的替代方案,以及FFmpeg在音视频处理中的重要作用等知识。

 
技术交流:

2、远古时期的HTML

Web端音视频的发展史得从刀耕火种的年代——早期 HTML说起。

在早期的 HTML,由于带宽、技术等各种因素限制,网页主要以简单的静态内容为主,只支持一些文字图片内容和简单的排版,不支持在线观看音视频。

图为 1994 年的 Yahoo!:

3、 Flash的兴起与淘汰

20 世纪初,随着互联网的发展,各种 Web 应用和门户网站不断出现,人们渴望在网页上看到更加丰富多彩的内容,比如视频、动画等等,于是 Flash 进入了人们的视野。

彼时的 Flash 没有像现在大家印象中的那么臃肿,刚诞生的 Flash 小巧、高效、跨平台,同时凭借几十 K 的体积做出放大也不会失真的各种矢量彩色动画,在还是拨号上网,带宽条件受限,加载一个在线视频需要好几分钟的年代脱颖而出,甚至可以做出各种令人沉迷的 Flash 小游戏。

Flash 塑造了很多经典的小游戏角色,火柴人就是其中之一:

Flash 的兴起,得益于当时 HTML 对于媒体文件支持的匮乏。Flash 以插件的形式,干着平台才需要负担的繁重工作,并得益于 Adobe 的大力推广,Flash 先后增加了对 Javascrip、HTML、XML 的支持,并增强了影音方面的功能。同时由于 Flash 跨平台的特性,非常容易被移植,市面上稍微高端点的设备,也得乖乖地给 Adobe 交授权费。

然而 2007 年推出的 iPhone 并不买账,他们以增加续航、安全为由抛弃了 Flash,很多人一开始对此嗤之以鼻,但事实证明苹果对此确实有远见,大量低质量的 Flash 使当时续航本就有限的移动设备更加不堪重负。2012 年,Android 也宣布不再支持 Flash,Flash 在移动市场不再有立足之地。

在桌面市场上,Flash 的日子也并不好过。Chrome 从的 Chrome 42 开始,就已经强制把 Flash 装入沙箱,以 PPAPI 的形式运行;而从 Chromium 版本号 88 开始,已经彻底不再支持 Flash 技术了。微软的 Edge 浏览器也同步不支持 Flash。Chrome 的前辈 Firefox 更加激进,从 2016 年就已经默认禁止 Flash 运行了。

至于 Flash 为什么走向了淘汰,除了它的效率变低,不安全因素过多,稳定性不足外,还有一个重要原因:Web 音视频解决方案有了更好的替代品—— HTML5。

4、HTML5的到来

其实,对于 HTML5 是否可以真正替代 Flash,尤大在 2011 年已经给出了预言:

事实正如预言所预料,HTML5 在 2008 年发布后,经过不断改进完善,基本上能包办 Flash 所有能干的事情了。HTML5 引入了许多新特性和新功能,其中就包含了 video 和 audio 标签,也就是对音视频的支持。使用了支持 HTML5 标准的网络浏览器访问 HTML5 站点,用户无需在电脑上安装 Flash 插件就可以在线观看视频,摆脱了对 Flash 的依赖。

2021 年 1 月 20 日,chrome 88 正式发布,彻底的禁止使用 Flash。自此,Flash 算是彻底退出了历史舞台。

5、到底什么是视频

视频,其实就是一系列连续播放的图片,如果一秒钟播放 24 张图片,那么人眼看到的就不再是一张张独立的图片,而是动起来的画面。

其中一张图片称为一帧,1s 播放的图片数称为帧率。由于人类眼睛的特殊生理结构,如果所看画面之帧率高于每秒约 10-12 帧的时候,就会认为是连贯的;当看到帧率为 24 fps 以上时,大脑会认为这是流畅播放的视频。所以一般有声电影的拍摄及播放帧率大约为每秒 24 帧,欧美、日本那边由于电视制式不同,大约为 30 帧。

关于视频及视频编码相关的入门文章可以继续详读以下资料:

6、电影的帧率与游戏的帧率

为什么 24 帧的电影比 30 帧的游戏要流畅许多?这其中的原因就在于,电影和游戏的图像生成原理不同。

电影的 24 fps,是每 1/24 秒拍摄一副画面,如果你玩过相机的手动设置,你应该知道如果以 1/24 秒的快门速度拍摄一个运动的物体会“糊”掉,而正是这样“糊”掉的画面连起来才让我们的眼睛看上去很“流畅”。

而游戏画面不是按 1/24 秒快门拍出来的,而是每一幅画面都是独立渲染出来的,之所以跑成 24fps 是因为显卡处理能力不够而“丢弃”了其中的一些画面,这样一来每两幅画面之间就不连续了,自然看上去会“卡”。

举个例子:一个圆从左上角移动到右下角,如果是电影,第一帧与第二帧可能是类似下图这样的。

如果是游戏画面,第一帧与第二帧会类似下面这两张图:

此外,帧与帧之间间隔恒定:人眼对于动态视频的捕捉是非常敏感的,电影帧率是固定不变,肉眼很难察觉出异常。

而游戏的帧率却是很容易变化的——如果手动锁定帧数,显卡会默认渲染最高帧率。

玩家触发的很多剧情往往伴随剧烈的画面变动,这时显卡的帧率就会出现下降,前后不一致的帧率很容易被肉眼捕捉,这时我们就会觉得,游戏变“卡”了。

7、视频的编码

7.1 概述

视频是由图片构成的,图片是由像素构成的,假设尺寸为 1980*1080。每个像素由 RGB 构成,每个 8 位,共 24 位。

假设帧率是 24,那么每秒钟的视频的尺寸如下:

一分钟视频的尺寸就是 9237888000 Bytes 已经是 8.8 个 G 了。可以看到,如果是不对视频做任何处理,是非常不方便对于视频做传输与存储的,所以需要对视频进行压缩,也就是编码。

7.2 视频编码

视频图像数据有很强的相关性,也就是说有大量的冗余信息。其中冗余信息可分为空域冗余信息和时域冗余信息。压缩技术就是将数据中的冗余信息去掉(去除数据之间的相关性),压缩技术包含帧内图像数据压缩技术、帧间图像数据压缩技术和熵编码压缩技术。

经过编码之后,视频由一帧帧的图片,变成了一串串让人看不懂的二进制代码,因为编码的方式(算法)的不同,所以就有了编码格式的区分。常见的编码格式有 H.264,MPEG-4,VP8 等。

我们前端开发只需要记住一点,主流浏览器支持的视频编码格式是 H.264。

7.3 音频编码

CD 音质的音频,存放一分钟数据需要的大小为 10M,太大了,也需要压缩(编码)。

常见的编码方式有:WAV、MP3 和 AAC 格式。

音频的编码方式不像视频那样那么多,而且音频在各个浏览器基本上都可以播放。具体的每种编码格式包含的音频是怎么构成的,这里就不讲了。

关于音频及音频编码相关的入门文章可以继续详读以下资料:

7.4 封装格式

我们把视频数据、音频数据打包到一起,然后再添加一些基本信息,例如分辨率、时长、标题等,构成一个文件,这个文件称为封装格式。常见的封装格式有 MP4、AVI、RMVB 等。

可以看出:视频的封装格式和视频的编码格式往往是无关的。一个 mp4 文件里面的视频流编码可以是 h264也可以是 mpeg-4。所以就会出现,同样都是 mp4 文件,有的浏览器可以放,有的浏览器就放不了的问题,因为能不能放是由视频码流的编码格式决定的。

8、视频的码率

码率,也叫比特率,帧率是 1s 播放多少帧,类比一下,比特率就是 1s 的视频有多少 bit。这个参数直接决定了视频的大小与清晰程度。

一般网上流传的电影 MKV(BDrip-1080P)的码率是 10Mb/s 左右,蓝光原盘是 20Mb/s 左右,这两者都是 H.264 编码的。另外一些 MV、PV、演示片什么的除了 H.264 编码,可能还有 MPEG-2 编码,码率大小不等,像 youtube 那些在线的 1080P 的视频,码率可能只有 5Mb/s,而一些 MV 的码率可以高到离谱,可以达到 110Mb/s 的,3 分多钟的 MV 差不多有 3GB 大小。

而一般的视频剪辑、后期软件,在输出序列的时候,都会有码率这个选项。

9、视频播放器的原理

播放视频的基本流程是:解协议 → 解封装 → 解码 → 视音频同步。如果播放本地文件则不需要解协议。

解协议的作用,就是将流媒体协议的数据,解析为标准的相应的封装格式数据。视音频在网络上传播的时候,常常采用各种流媒体协议,例如 HTTP、RTMP或是 MMS 等等。这些协议在传输视音频数据的同时,也会传输一些信令数据。这些信令数据包括对播放的控制(播放、暂停、停止),或者对网络状态的描述等。解协议的过程中会去除掉信令数据而只保留视音频数据。

解封装的作用,就是将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据。封装格式种类很多,例如 MP4、MKV、RMVB、TS、FLV、AVI 等等,它的作用就是将已经压缩编码的视频数据和音频数据按照一定的格式放到一起。例如,FLV 格式的数据,经过解封装操作后,输出 H.264 编码的视频码流和 AAC 编码的音频码流。

解码的作用,就是将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。音频的压缩编码标准包含 AAC、MP3、AC-3 等等,视频的压缩编码标准则包含 H.264、MPEG2、VC-1 等等。解码是整个系统中最重要也是最复杂的一个环节。通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如 YUV420P、RGB 等等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如 PCM 数据。

视音频同步的作用,就是根据解封装模块处理过程中获取到的参数信息,同步解码出来的视频和音频数据,并将视频音频数据送至系统的显卡和声卡播放出来。

10、HTML5的canvas播放视频

如果我们碰到一些特殊机型或者特殊情况 HTML5 的 video 解决方案不是很好处理,也可以采用 Canvas 去播放这个视频。

使用 Canvas 播放视频主要是利用 ctx.drawImage(video, x, y, width, height) 来对视频当前帧的图像进行绘制,其中 video 参数就是页面中的 video 对象。所以如果我们按照特定的频率不断获取 video 当前画面,并渲染到 Canvas 画布上,就可以实现使用 Canvas 播放视频的功能。

<video id="video" controls="controls" style="display: none;">

    <source src="https://xxx.com/vid_159411468092581" />

</video>

<canvas  id="myCanvas" width="460" height="270" style="border: 1px solid blue;" ></canvas>

<div>

    <button id="playBtn">播放</button>

    <button id="pauseBtn">暂停</button>

</div>

 

const video = document.querySelector("#video");

const canvas = document.querySelector("#myCanvas");

const playBtn = document.querySelector("#playBtn");

const pauseBtn = document.querySelector("#pauseBtn");

const context = canvas.getContext("2d");

let timerId = null;

function draw() {

    if (video.paused || video.ended) return;

    context.clearRect(0, 0, canvas.width, canvas.height);

    context.drawImage(video, 0, 0, canvas.width, canvas.height);

    timerId = setTimeout(draw, 0);

}

playBtn.addEventListener("click", () => {

    if (!video.paused) return;

    video.play();

    draw();

});

pauseBtn.addEventListener("click", () => {

    if (video.paused) return;

    video.pause();

    clearTimeout(timerId);

});

事实上,市面上已经有不少 Canvas 播放视频的解决方案,比较出名的是这个 JSMpeg。它和 PIXI 一样,可以选择 WebGL 渲染视频也可以直接用 Canvas 渲染视频。

JSMpeg 是没有 npm 包的,但是社区上有开发者基于 JSMpeg 封装了一个 npm 包:https://github.com/cycjimmy/jsmpeg-player

在官网上是这么介绍的:

JSMpeg is a Video Player written in JavaScript. It consists of an MPEG-TS Demuxer, WebAssembly MPEG1 Video & MP2 Audio Decoders, WebGL & Canvas2D Renderers and WebAudio Sound Output. JSMpeg can load static files via Ajax and allows low latency streaming (~50ms) via WebSocktes.

由于它所支持的编码格式不是常规的 H.264,而是比较老的 MPEG1,并且解封装器为 MPEG-TS。所以一般我们使用它去渲染视频的格式为 TS。TS 是日本高清摄像机拍摄下进行的封装格式,全称为 MPEG2-TS。它的特点就是要求从视频流的任一片段开始都是可以独立解码的。

TS 文件通常作为多个文件保存在 DVD 上,虽然它可以在高清摄像机、蓝光 DVD 中无需借助其他软件就能直接打开,但是 TS 视频文件与大多数的媒体播放器、便携式播放器或视频编辑工具都不兼容,所以这个时候,FFmpeg 就可以出场了。

11、视频操作神器——FFmpeg

FFmpeg是一个开源的软件,我们直接用 homebrew 就可以安装:

1brew install ffmpeg

如果我们想转换为 jsmpeg 所需的 ts 格式视频,可以执行:

$ ffmpeg -i input.mp4 -f mpegts \

         -codec:v mpeg1video -s 640x360 -b:v 1500k -r 25 -bf 0 \

         -codec:a mp2 -ar 44100 -ac 1 -b:a 64k \

         output.ts

  • 1)i:指定输入文件,这里指定为 input.mp4;
  • 2)f 指明输出文件的封装格式,这里为 jsmpeg 所需的 mpegts;
  • 3)codec:v 指明输出文件的视频编码,这里指明为 jsmpeg 所需的 mpeg1video;
  • 4)s 设置视频分辨率,参数格式为w*h或w×h;
  • 5)b:v 设置视频码率,一般如果想得到高清的效果,至少需要 4000k 以上,如果对视频体积有要求,可以视情况小一点;
  • 6)r 设置帧率(fps),一般都为 25;
  • 7)bf bframe 数目控制,一般为 0。

B 帧法(B frame)是双向预测的帧间压缩算法。当把一帧压缩成 B 帧时,它根据相邻的前一帧、本帧以及后一帧数据的不同点来压缩本帧,也即仅记录本帧与前后帧的差值。

  • 1)codec:a 指明输出文件的音频编码;
  • 2)ar 设置音频编码采样率,单位kHz,一般网上的音频,大多为 44100;

音频采样率是指录音设备在单位时间内对模拟信号采样的多少,采样频率越高,机械波的波形就越真实越自然;

  • 3)ac 设置音频编码声道数;
  • 4)b:a 设置音频码率;

音频码率,指一个音频流中每秒钟能通过的数据量,码率越大的话,音质越好。

  • 最后一个参数即为输出文件位置与名称和后缀格式。

FFmpeg 是一个非常强大的音视频转换工具,不仅可以视频转换,还可以视频尺寸裁剪、视频时长裁剪、视频拼接等等功能,目前很多在线视频剪辑工具基本是基于 FFmpeg 开发的。

12、音视频的一些资源推荐

国内学习音视频相关的开发,绕不过的一个大神是雷霄骅,大佬已经去世了,但是留下的文章永垂不朽。本文也是参考了雷霄骅的部分博客,如果感兴趣,可以从这篇文章看起:《视音频编解码技术零基础学习方法》。

对于直播 webrtc 感兴趣的,也可以看一下 Real time communication with WebRTC,国内慕课网上李超老师也有不错的教程。

对 ffmpeg 感兴趣的,可以看一下这里:https://github.com/leandromoreira/ffmpeg-libav-tutorial

13、参考资料

[1] 即时通讯音视频开发(十八):详解音频编解码的原理、演进和应用选型

[2] 即时通讯音视频开发(十九):零基础,史上最通俗视频编码技术入门

[3] 即时通讯音视频开发(二十):一文读懂视频的颜色模型转换和色域转换

[4] 实时语音聊天中的音频处理与编码压缩技术简述

[5] 网易视频云技术分享:音频处理与压缩技术快速入门

[6] 福利贴:最全实时音视频开发要用到的开源工程汇总

[7] 理解实时音视频聊天中的延时问题一篇就够

[8] 写给小白的实时音视频技术入门提纲

[9] 爱奇艺技术分享:轻松诙谐,讲解视频编解码技术的过去、现在和将来

[10] 零基础入门:实时音视频技术基础知识全面盘点

[11] 实时音视频面视必备:快速掌握11个视频技术相关的基础概念

[12] 实时音视频开发理论必备:如何省流量?视频高度压缩背后的预测技术

[13] 视频直播技术干货(十三):B站实时视频直播技术实践和音视频知识入门

[14] 零基础入门:基于开源WebRTC,从0到1实现实时音视频聊天功能

[15] 实时音视频入门学习:开源工程WebRTC的技术原理和使用浅析

[16] 零基础快速入门WebRTC:基本概念、关键技术、与WebSocket的区别等


(本文已同步发布于:http://www.52im.net/thread-4840-1-1.html)

posted @ 2025-06-26 15:25 Jack Jiang 阅读(62) | 评论 (0)编辑 收藏

Jack Jiang的 Mail: jb2011@163.com, 联系QQ: 413980957, 微信: hellojackjiang