Jack Jiang

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

2016年12月28日

     摘要: 本文引用了刘欣的文章,感谢原作者的分享。1、引言Http协议在现今主流的IM系统中拥有无可替代的重要性(在IM系统中用HTTP发起的连接被大家简称为http短连接),但Http作为传统互联网信息交换技术,一些典型的概念比如:Session、Token,对于新手程序员来说很陌生。很多文章动辄长篇大论、高屋建瓴地从底层协议再到上层分布式应用式的讲解,根本不适合傻白甜程序员,本文的写作目的是以最白话地方...  阅读全文

posted @ 2018-06-19 11:27 Jack Jiang 阅读(17) | 评论 (0)编辑 收藏

     摘要: 本文引用了自简书作者“涤生_Woo”的文章,内容有删减,感谢原作者的分享。1、前言HTTP(全称超文本传输协议,英文全称HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。对于移动端即时通讯(尤其IM应用)来说,现今主流的数据通信总...  阅读全文

posted @ 2018-06-15 17:46 Jack Jiang 阅读(23) | 评论 (0)编辑 收藏

     摘要: 1、前言在IM这种讲究高并发、高消息吞吐的互联网场景下,MQ消息中间件是个很重要的基础设施,它在IM系统的服务端架构中担当消息中转、消息削峰、消息交换异步化等等角色,当然MQ消息中间件的作用远不止于此,它的价值不仅仅存在于技术上,更重要的是改变了以往同步处理消息的思路(比如进行IM消息历史存储时,传统的信息系统作法可能是收到一条消息就马上同步存入数据库,这种作法在小并发量的情况下可以很好的工作,但...  阅读全文

posted @ 2018-06-12 15:13 Jack Jiang 阅读(239) | 评论 (0)编辑 收藏

     摘要: 1、前言有人说 2017 年是 WebRTC 的转折之年,2018 年将是 WebRTC 的爆发之年,这并非没有根据。就在去年(2017年),WebRTC 1.0 标准草案出炉(实际上WebRTC标准草案的早期版本早在2011年就已经发布,WebRTC并非一夜之间就出现的技术),并将于今年正式发布。与此同时,越来越多的浏览器和厂商都开始对它进行广泛的支持,WebRTC 即将成为互联网的基础设施了,...  阅读全文

posted @ 2018-06-04 12:25 Jack Jiang 阅读(29) | 评论 (0)编辑 收藏

     摘要: 本文原作者: 夏之南,感谢原作者的分享。1、前言不知不觉,微信已经诞生七年了。 从第一版到现在,微信的演变史,很像一部创业史,很好地诠释了创业者能经得起多少质疑和差评,才配拥有多大的成功。编者注:微信作为移动端IM的标杆,无论是产品定义还是技术追求(关于微信团队对技术的极致追求,可以在即时通讯网找到很多微信团队分享的文章,从文字中完全可以理解微信团队的技术追求),都值得广大即时通讯技术开发者学习。...  阅读全文

posted @ 2018-05-30 13:27 Jack Jiang 阅读(20) | 评论 (0)编辑 收藏

     摘要: 本文来自七牛云Android 多媒体开发工程师卢俊的技术分享,即时通讯网有改动。1、前言这是由一篇我的演讲稿整理出来的文章,目标读者是对实时音视频开发感兴趣但是又不知道如何下手的初学者们,希望把我的经验分享出来,对大家有所帮助。学习交流:- 即时通讯开发交流3群:185926912[推荐]- 移动端IM开发入门文章:《新手入门一篇就够:从零开发移动端IM》(本文同步发布于:http://www.5...  阅读全文

posted @ 2018-05-28 12:16 Jack Jiang 阅读(256) | 评论 (0)编辑 收藏

     摘要: 1、前言IM的群聊消息,究竟存1份(即扩散读方式)还是存多份(即扩散写方式)?上一篇文章《IM群聊消息的已读回执功能该怎么实现?》是说,“很容易想到,是存一份”,被网友们骂了,大家争论的很激烈(见下图)。 网友骂的对,任何技术方案,都不是天才般灵感乍现想到的,一定是一个演进迭代,逐步优化的过程。今天就聊一聊,IM群聊消息,为啥只需要存一份。不过,从公开的技术资料来...  阅读全文

posted @ 2018-05-25 12:25 Jack Jiang 阅读(199) | 评论 (0)编辑 收藏

     摘要: 本文引用了架构师之路公众号作者沈剑的文章,内容有改动,感谢原作者。1、前言我们平时在使用即时通讯应用时候,每当发出一条聊天消息,都希望对方尽快看到,并尽快回复,但对方到底有没有真的看到?我却并不知道。一个残酷的现实是,很多时候对方其实是早就已经看到了这条消息,但出出种种原因(大家都懂的),通常都是默默返回——假装没看见。像微信这样的熟人社交工具,在产品的设计理念上,为了保持...  阅读全文

posted @ 2018-05-23 12:49 Jack Jiang 阅读(269) | 评论 (0)编辑 收藏

     摘要: 本文来自微信技术架构部的原创技术分享。1、前言在上篇《IPv6技术详解:基本概念、应用现状、技术实践(上篇)》,我们讲解了IPV6的基本概念。本篇将继续从以下方面展开对IPV6的讲解:IPv6在Linux操作系统下的实现;IPv6的实验;IPv6的过渡技术介绍;IPv6在Linux平台下socket编程应该注意的问题。如您对IPV6的基本概念尚未了解,请先阅读本文的上篇。学习交流:- 即时通讯开发...  阅读全文

posted @ 2018-05-21 12:06 Jack Jiang 阅读(217) | 评论 (0)编辑 收藏

     摘要: 本文来自微信技术架构部的原创技术分享。1、前言普及IPV6喊了多少年了,连苹果的APP上架App Store也早已强制IPV6的支持,然并卵,因为历史遗留问题,即使在IPV4地址如果饥荒的情况下,所谓的普及还是遥遥无期。但不可否认的是,IPV6肯定是未来趋势,做为网络通信领域的程序员来说,详细学习和了解IPV6是很有必要的,所谓厚积薄发,谁知道哪天IPV6真的普及了呢?那么,我们开始看正文吧。学习...  阅读全文

posted @ 2018-05-18 15:14 Jack Jiang 阅读(235) | 评论 (0)编辑 收藏

     摘要: 本系列文章引用了腾讯技术专家樊华恒《海量之道系列文章之弱联网优化》的部分章节,感谢原作者。1、前言随着移动互联网的高速发展,移动端IM以移动网络作为物理通信载体早已深入人心,这其中的成功者就包括微信、手机QQ、支付宝(从即时通讯产品的角度来看,支付宝已经算的上是半个IM了)等等,也为移动端即时通讯开发者带来了各种可以参考的标杆功能和理念:语音对讲、具有移动端体验特性的图片消息、全时在线的概念、真正...  阅读全文

posted @ 2018-05-11 13:19 Jack Jiang 阅读(290) | 评论 (0)编辑 收藏

     摘要: 本文引用了作者Smily(博客:blog.csdn.net/qq_20521573)的文章内容,感谢无私分享。1、前言目前苹果公司已经强制iOS应用必须使用HTTPS协议开发(详见《苹果即将强制实施 ATS,你的APP准备好切换到HTTPS了吗?》),虽然Google没有强制开发者使用HTTPS,但相信不久的将来Android也会跟随iOS全面转向HTTPS。因此,HTTPS的学习也是相当重要。本...  阅读全文

posted @ 2018-05-07 11:47 Jack Jiang 阅读(460) | 评论 (0)编辑 收藏

     摘要: 1、前言微信朋友圈包括图片和视频两套业务架构组成,朋友圈图片的特点是请求量大、消耗计算资源较多,视频则主要消耗带宽。朋友圈的数据是永远存储的,而且随着业务的快速发展,存储容量、带宽和设备的消耗大量增加,尤其重大节日带来的使用量增长,更加剧了消耗,也给运维人员的保障带来了巨大压力。在重在节假日节点,技术保障主要由三方面组成:1)软件保障指通过程序、业务逻辑层面的优化和评估,减轻负载;2)硬件保障主要...  阅读全文

posted @ 2018-05-04 18:14 Jack Jiang 阅读(401) | 评论 (0)编辑 收藏

     摘要: 1、前言2017 年 12 月,微信小程序向开发者开放了实时音视频能力,给业内带来广阔的想象空间。连麦互动视频直播技术在 2016 年直播风口中成为视频直播的标配,然而只有在原生的 APP 上才能保障良好的用户体验。那时候,在微信小程序中无法进行实时音视频互动。微信小程序在去年 12 月宣布开放实时音视频能力,再加上去年 6 月苹果宣布即将支持 WebRTC,业内一下子千树万树梨花开,前途一片光明...  阅读全文

posted @ 2018-05-02 11:10 Jack Jiang 阅读(386) | 评论 (0)编辑 收藏

     摘要: 1、前言每年年初腾讯公司都要制定 SNG 成本优化年度目标,过去三年已经用技术手段为公司节省了超过 10 亿的现金流。产品的架构和容量也越来越健康,继续成本优化变得十分艰难。但我们在迷茫中仍然定下了再优化 3 亿元的目标。很幸运,2017 年我们实现了这个目标,并再次获得公司级奖励,这是非常不容易的。因为“成本与质量”是个平衡木,而 2017 年 SNG 产品面临着激烈的内...  阅读全文

posted @ 2018-04-28 10:51 Jack Jiang 阅读(401) | 评论 (0)编辑 收藏

     摘要: 本文来自微信开发团队WeMobileDev公众号的技术分享。1、前言微信的移动客户端全文搜索中的多音字问题一直是搜索体验的痛点之一。微信客户端全文搜索在上线以后,也经常收到用户关于多音字问题的反馈。所以,微信全文搜索中的多音字搜索成了一个迫切需要解决的问题。本文重点讲述微信安卓客户端在SQLite FTS5的基础上,多音字问题的解决方案。另外:微信团队在另一个文章《微信手机端的本地数据全文检索优化...  阅读全文

posted @ 2018-04-17 16:36 Jack Jiang 阅读(356) | 评论 (0)编辑 收藏

本文作者:丁同舟,来自金蝶随手记技术团队。

1、前言

本文接上篇《金蝶随手记团队分享:还在用JSON? Protobuf让数据传输更省更快(原理篇)》,以iOS端的Objective-C代码为例,向您演示如何使用Protobuf。

学习交流:

- 即时通讯开发交流群:320837163[推荐]

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

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

2、系列文章

本文是系列文章中的第2篇,总目录如下:

金蝶随手记团队分享:还在用JSON? Protobuf让数据传输更省更快(原理篇)

金蝶随手记团队分享:还在用JSON? Protobuf让数据传输更省更快(实战篇)》(本文)

另外,如果您还打算系统地了解IM的开发知识,可以阅读《新手入门一篇就够:从零开发移动端IM》。

3、参考资料

Protobuf通信协议详解:代码演示、详细原理介绍等

一个基于Protocol Buffer的Java代码演示

如何选择即时通讯应用的数据传输格式

强列建议将Protobuf作为你的即时通讯应用数据传输格式

全方位评测:Protobuf性能到底有没有比JSON快5倍?

移动端IM开发需要面对的技术问题(含通信协议选择)

简述移动端IM开发的那些坑:架构设计、通信协议和客户端

理论联系实际:一套典型的IM通信协议设计详解

详解如何在NodeJS中使用Google的Protobuf

>> 更多同类文章 ……

4、基本介绍

Protocol buffers为 Google 提出的一种跨平台、多语言支持且开源的序列化数据格式。相对于类似的 XML 和 JSON,Protocol buffers 更为小巧、快速和简单。其语法目前分为proto2和proto3两种格式。

目前 Google 官方的 Protobuf最新 release 版本为3.5.1,以下都是基于此版本的环境搭建。

关于 Protocol Buffer 的使用可以查阅官方文档:https://developers.google.com/protocol-buffers/docs/overview

5、准备工作

5.1 环境要求

Objective-C 2.0 Runtime (32bit & 64bit iOS, 64bit OS X)

Xcode 7.0+

注意:

Protobuf 出于性能考虑没有使用 ARC,但在 ARC 下是可以使用的。

5.2 安装

下载 Protobuf 代码包(https://github.com/google/protobuf/releases),这里选择 protobuf-objectivec-3.5.1.tar.gz。

5.3 解压代码包

编译 Protobuf,这里可能需要安装部分工具:

$ brew install autoconf

$ brew install automake

$ brew install libtool

运行下面脚本进行编译:

$ ./autogen.sh

$ ./configure

$ make

$ makeinstall

检查protobuf是否安装成功:

$ protoc --version

如果成功打印版本号则安装成功:

libprotoc 3.5.1

6、在 iOS 中使用 Protobuf

6.1 创建.proto文件

这里使用官方文档上的一份示例数据结构创建Person.proto:

syntax = "proto3";

message Person {

  string name = 1;

  int32 id = 2;

  string email = 3;

  enumPhoneType {

    MOBILE = 0;

    HOME = 1;

    WORK = 2;

  }

  message PhoneNumber {

    string number = 1;

    PhoneType type = 2;

  }

  repeated PhoneNumber phone = 4;

}

使用命令行编译Person.proto为objective-c的文件,编译出来的文件为Person.pbobjc.h和Person.pbobjc.m:

protoc Person.proto --objc_out=./

6.2 引入 Protobuf 运行时资源

Google 官方的文档提供了两种引入方式,但使用第一种的时候编译不能通过,所以这里选择了第二种:

复制protobuf目录下的:objectivec/*.h, objectivec/google/protobuf/*.pbobjc.h, objectivec/google/protobuf/*.pbobjc.m, 以及除去objectivec/GPBProtocolBuffers.m后的objectivec/*.m。

这里直接用命令行操作,首先进入protobuf下objectivec的目录:

$ cdprotobuf-3.5.1/objectivec

然后复制符合规则的文件到指定的工程目录下:

$mkdir~/ProtobufDemo/ProtocolBuffers~/ProtobufDemo/ProtocolBuffers/google~/ProtobufDemo/ProtocolBuffers/google/protobuf

$ cp*.h *.m ~/ProtobufDemo/ProtocolBuffers

$ cpgoogle/protobuf/*.pbobjc.h google/protobuf/*.pbobjc.m ~/ProtobufDemo/ProtocolBuffers/google/protobuf

注意:

上面的命令并没有排除 GPBProtocolBuffers.m 文件,引入时需要手动排除。

现在把ProtocolBuffers目录下所有文件以及上面编译出来的Person.pbobjc.h和Person.pbobjc.m都引入到工程中。

现在工程目录结构大概是长这样:

需要注意,由于protobuf没有使用 ARC,因此需要为所有.m文件加上-fno-objc-arc来关闭 ARC:

注意:

需要注意工程中的 Header Search Paths 要增加 $(PROJECT_DIR)/ProtocolBuffers(具体的路径视情况而定)

6.3 直接引入 ProtocolBuffers 工程

如果觉得手动引入文件的方式过于复杂,可以直接引入ProtocolBuffers工程作为依赖项:

1)进入解压后的protobuf目录下,复制objective目录下的所有文件到ProtobufDemo/ProtocolBuffers目录下;

2)在ProtobufDemo工程中引入ProtocolBuffers_iOS工程:

3)在Build Phases中加入依赖关系并链接库:

4)引入Person.pbobjc.h和Person.pbobjc.m文件并为.m加上-fno-objc-arc;

5)修改工程配置中部分路径为 $(PROJECT_DIR)/ProtocolBuffers。

6.4 运行测试

首先引入头文件:

#import "Person.pbobjc.h"

生成Person对象并进行编码和解码:

Person *p = [[Person alloc] init];

p.id_p = 1;

p.name = @"person1";

p.email = @"123@qq.com";


//encode

NSData*data = [p data];

NSLog(@"Protocol Buffers:\n%@\nData: %@\nData Length: %lu", p, data, data.length);


//decode

Person *newP = [[Person alloc] initWithData:data error:nil];

NSLog(@"Decoded: %@", newP);

运行程序,打印日志如下:

Protocol Buffers:

: {

    name: "person1"

    id: 1

    email: "123@qq.com"

}

Data: <0a077065 72736f6e 3110011a 0a313233 4071712e 636f6d>

Data Length: 23

Decoded: : {

    name: "person1"

    id: 1

    email: "123@qq.com"

}

Coffee time!

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

posted @ 2018-04-03 11:28 Jack Jiang 阅读(516) | 评论 (0)编辑 收藏

     摘要: 本文作者:丁同舟,转载自“随手记技术团队”微信公众号。1、前言跟移动端IM中追求数据传输效率、网络流量消耗等需求一样,随手记客户端与服务端交互的过程中,对部分数据的传输大小和效率也有较高的要求,普通的数据格式如 JSON 或者 XML 已经不能满足,因此决定采用 Google 推出的 Protocol Buffers 以达到数据高效传输。(本文同步发布于:http://ww...  阅读全文

posted @ 2018-04-02 12:23 Jack Jiang 阅读(432) | 评论 (0)编辑 收藏

     摘要: 1、长连接在iOS开发中的应用常见的短连接应用场景:一般的App的网络请求都是基于Http1.0进行的,使用的是NSURLConnection、NSURLSession或者是AFNetworking,Http1.0链接最显著的特点就是客户端每一次需要主动向服务端发送请求,都需要经历建立链接、发送请求、返回数据、关闭链接这几个阶段,是一种单向请求且无状态的协议。长连接的应用场景:有的时候,我们需要服...  阅读全文

posted @ 2018-03-26 11:53 Jack Jiang 阅读(390) | 评论 (0)编辑 收藏

     摘要: 1、前言IM App 是我做过 App 类型里复杂度最高的一类,里面可供深究探讨的技术难点非常之多。这篇文章和大家聊下从移动端客户端的角度所关注的IM消息可靠性和送达机制(因为我个人对移动客户端的经验积累的比较丰富嘛)。学习交流:- 即时通讯开发交流群:320837163[推荐]- 移动端IM开发入门文章:《新手入门一篇就够:从零开发移动端IM》(本文同步发布于:http://www.52im.n...  阅读全文

posted @ 2018-03-19 14:52 Jack Jiang 阅读(343) | 评论 (0)编辑 收藏

     摘要: 编辑文章1、前言从直播在线上抓娃娃,不断变化的是玩法的创新,始终不变的是对超低延迟的苛求。实时架构是超低延迟的基石,如何在信源编码、信道编码和实时传输整个链条来构建实时架构?在实时架构的基础之上,如果通过优化采集、编码、传输、解码和渲染中的关键环节来降低延迟?本文将会介绍即构在这方面的思考与实践。学习交流:- 即时通讯开发交流群:320837163 [推荐]- 移动端IM开发入门文章:《...  阅读全文

posted @ 2018-03-17 10:59 Jack Jiang 阅读(373) | 评论 (0)编辑 收藏

     摘要: 一个典型的IM系统中最为重要也是用户最先接触到的——就是基于Http的SSO单点登陆接口(有的系统里可能并不叫SSO接口,本文讨论的是其广义:即实现身份认证功能的http接口),那么这个SSO接口工作原理是什么?可以怎么来实现?有无最佳实践建议?  阅读全文

posted @ 2018-01-18 14:35 Jack Jiang 阅读(493) | 评论 (0)编辑 收藏

     摘要: 微信内部正在使用的网络层封装库Mars于2016年12月28日正式公开源码,Mars开源的意义是可为IM及相关技术应用领域的同行带来很多有价值的实践成果,毕竟微信的体量和应用规模决定了技术的高度,确实是值得同行学习和关注。  阅读全文

posted @ 2016-12-28 22:21 Jack Jiang 阅读(1678) | 评论 (0)编辑 收藏

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