首先要感谢你们一直以来对于GGTalk即时通信系统的关注和支持!GGTalk即时通信系统的不断完善与你们的支持分不开! 从2013年最初的GG1.0开放源码以来,到后来陆续增长了网盘功能、远程协助功能、离线文件功能、群聊功能、语音聊天功能、视频聊天功能、以及视讯录制功能、和增长了数据库——一路走来,结识许多朋友,你们不只对GGTalk即时通信系统的源码提了许多宝贵的建议,我还有幸与某些朋友取得了项目上的合做,这一切都是美妙的缘分!html
一直以来,GGTalk即时通信系统的移动端始终是一个缺憾。前段时间恰好结识了一位作android开发的朋友,他也颇有兴趣参与,因而GGTalk即时通信系统的移动端也借此契机而诞生了!android
本文我主要是想为你们介绍一下打通PC端和移动端背后的基本原理,并以GGTalk即时通信系统的android版做为示例demo供你们参考。固然,这个demo只是完成了GGTalk客户端所有功能的一小部分,之后咱们会陆续将更完善的版本分享给你们。 数据库
想要直接下载体验的朋友请点击:“下载中心” windows
本次的GGTalk即时通信系统安卓demo已实现以下功能:服务器
(1)登陆服务端网络
(2)文字聊天,表情图片,消息提醒工具
(3)好友列表spa
(4)显示好友在线状态orm
(5)文件传输 视频
打通不一样平台的客户端中间相互通讯,须要知足如下几个条件:
1. 使用同一个公共的服务器进行数据中转。
在GG中,咱们.NET的PC端和android移动端都是使用基于.NET开发的GG服务端做为服务器。
2. 通讯消息的格式必须达成一致。
通常来讲,使用文本协议(好比xml)是很是方便的,可是文本协议有两个主要缺陷:
(1)消息个头大,浪费带宽。
(2)传递二进制数据不方便。好比,传文件这样的功能,文件的本质是byte[],文本消息表达byte[]就很麻烦。
GG使用的不是文本协议,而是二进制协议,这样,在开发android端时,就须要遵循GG现有的消息格式,才能与GG进行正常的通讯。
3. 注意不一样平台上的字节序的转换。
好比,android / Java 采用的是big endian,而windows /.NET采用的是little endian。
二进制协议,又叫“流协议”,流协议规定网络上传递的任何一个消息必须符合如下规则:
(1) 消息由“消息头”(Message Header)和“消息体”(Message Body)构成,消息体能够为空。
(2) 消息头的长度是固定的。
(3) 消息头中至少直接或间接包含了一个信息,那就是消息体的长度。
(4) 若是有消息体,则消息体必须紧接在消息头的尾部。
GG使用紧凑的二进制序列化器,来完成流(byte[])与协议对象(Contract object)之间的相互转换。在开发GG移动端的某个功能时,首先得实现将这个功能对应的协议对象按照紧凑的二进制协议格式串行化到流中。好比,在GG移动端登陆时,会从服务器获取当前登陆用户的基本信息,这些信息在GG中使用GGUser类封装,服务器会把GGUser对象采用紧凑的二进制序列化器进行序列化获得byte[],传递给移动端,移动端就须要按协议格式来解析这个byte[],将其还原成GGUser对象。GGUser类的结构以下:
其对应的协议格式以下所示:
这个协议格式能够使用协议格式工具ContractFormatGenerator自动生成。协议格式中各个列的含义解释以下:
(1)FieldName:字段的名称。字段名称通常与协议类的属性名是对应的,若是某个属性的类型的长度是可变的(好比string),那么就要先加一个Field,来描述这个属性值转换给字节后的长度。
(2)Type:Field的类型。
(3)StartOffset:当前Field在byte[]中的起始偏移。
(4)Length:当前Field的值的长度。
要注意,协议格式中,第一个int是一个长度(GGUserLen),用来记录当前协议类序列化后的总长度(这个int的4个字节也包含在内) 。
至于协议类与流之间的相互转换细节,你们能够下载GG安卓版的源码详细研究,在此就不赘述了。
下载最新版本,请转到这里。
你们有什么问题和建议,敬请留言,也能够发送email到我邮箱:2027224508@qq.com。
若是你们以为还不错,请粉我,顺便再顶一下啊!