千呼万唤始出来!—— GG(高仿QQ)终于有移动端了!(技术原理、实现、源码)
首先要感谢大家一直以来对于GG的关注和支持!GG的不断完善与大家的支持分不开! 从2013年最初的GG1.0,到后来陆续增加了网盘功能、远程协助功能、离线文件功能、群聊功能、语音聊天功能、视频聊天功能、以及视讯录制功能、和增加了数据库——一路走来,结识许多朋友,大家不仅对GG提了许多宝贵的建议,我还有幸与某些朋友取得了项目上的合作,这一切都是美妙的缘分!
一直以来,GG的移动端始终是一个缺憾,我们也曾尽力想弥补这一缺憾,但是由于各种原因,一直未能如愿。前段时间刚好结识了一位做android开发的朋友,他也很有兴趣参与,于是GG的移动端也借此契机而诞生了!
本文我主要是想为大家介绍一下打通PC端和移动端背后的基本原理,并以GG的android版作为示例demo供大家参考。当然,这个demo只是完成了GG客户端全部功能的一小部分,以后我们会陆续将更完善的版本分享给大家。
想要直接下载体验的朋友请点击:“下载中心”
一.先睹为快
本次的GG安卓demo已实现如下功能:
(1)登录服务端
(2)文字聊天,表情图片,消息提醒
(3)好友列表
(4)显示好友在线状态
(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。
如果大家觉得还不错,请粉我,顺便再顶一下啊!
千呼万唤始出来!—— GG(高仿QQ)终于有移动端了!(技术原理、实现、源码)的更多相关文章
- android采用MVP完整漫画APP、钉钉地图效果、功能完善的音乐播放器、仿QQ动态登录效果、触手app主页等源码
Android精选源码 一个可以上拉下滑的Ui效果,觉得好看可以学学 APP登陆页面适配 一款采用MVP的的完整漫画APP源码 android实现钉钉地图效果源码 一个使用单个文字生成壁纸图片的app ...
- Socket实现仿QQ聊天(可部署于广域网)附源码(4)-加入数据库系统搭建完成
1.前言 这是本系列的第四篇文章,上一篇我们讲到实现了客户端对客户端的抖屏与收发各种类型文件,本篇文章我们加入SQLServer数据库实现登录与好友的添加等功能,并对界面做了美化处理.向往常一样我会把 ...
- Socket实现仿QQ聊天(可部署于广域网)附源码(1)-简介
1.前言 本次实现的这个聊天工具是我去年c#程序设计课程所写的Socket仿QQ聊天,由于当时候没有自己的服务器,只能在机房局域网内进行测试,最近在腾讯云上买了一台云主机(本人学生党,腾讯云有个学生专 ...
- Socket实现仿QQ聊天(可部署于广域网)附源码(2)-服务器搭建
1.前言 这是本系列的第二篇文章,第一篇文章得到了很多朋友们的支持,在这里表示非常的感谢.对于这一系列文章需要补充的是这只是一篇入门级别的Socket通信文章,对于专业人员来说完全可以跳过.本文只介绍 ...
- 高仿QQ即时聊天软件开发系列之三登录窗口用户选择下拉框
上一篇高仿QQ即时聊天软件开发系列之二登录窗口界面写了一个大概的布局和原理 这一篇详细说下拉框的实现原理 先上最终效果图 一开始其实只是想给下拉框加一个placeholder效果,让下拉框在未选择未输 ...
- 高仿QQ即时聊天软件开发系列之一开端
前段时间在园子里看到一个大神做了一个GG2014IM软件,仿QQ的,那感觉···,赶快下载源码过来试试,还真能直接跑起来,效果也不错.但一看源码,全都给封装到了ESFramework里面了,音视频那部 ...
- 史上最简单,一步集成侧滑(删除)菜单,高仿QQ、IOS。
重要的话 开头说,not for the RecyclerView or ListView, for the Any ViewGroup. 本控件不依赖任何父布局,不是针对 RecyclerView. ...
- Android实现高仿QQ附近的人搜索展示
本文主要实现了高仿QQ附近的人搜索展示,用到了自定义控件的方法 最终效果如下 1.下面展示列表我们可以使用ViewPager来实现(当然如果你不觉得麻烦,你也可以用HorizontalScrollVi ...
- 高仿QQ的即时通讯应用带服务端软件安装
Android 基于xmpp协议,smack包,openfire服务端(在下面)的高仿QQ的即时通讯实现.实现了注册,登录,读取好友列表,搜索好友,添加分组,添加好友,删除好友,修改心情,两个客户端之 ...
- 高仿QQ即时聊天软件开发系列之二登录窗口界面
继上一篇高仿QQ即时聊天软件开发系列之一开端之后,开始做登录窗口 废话不多说,先看效果,只有界面 可能还有一些细节地方没有做,例如那个LOGO嘛,不要在意这些细节 GIF虽短,可是这做起来真难,好吧因 ...
随机推荐
- hihoCoder 1080 : 更为复杂的买卖房屋姿势 线段树区间更新
#1080 : 更为复杂的买卖房屋姿势 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho都是游戏迷,“模拟都市”是他们非常喜欢的一个游戏,在这个游戏里面他们 ...
- H5学习系列之文件读取API--本文转自http://blog.csdn.net/jackfrued/article/details/8967667
HTML5定义了FileReader作为文件API的重要成员用于读取文件,根据W3C的定义,FileReader接口提供了读取文件的方法和包含读取结果的事件模型. FileReader的使用方式非常简 ...
- iOS通过手势拿到当前的View
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(t ...
- Ajax提交与传统表单提交的区别说明
Ajax提交是通过js来提交请求,请求与响应均由js引擎来处理,页面不会刷新,用户感觉不到实际上浏览器发出了请求.比如说我们希望网页总是显示最新的新闻,而又不想老是去点刷新按钮,我们就可以用Ajax机 ...
- mac端的优秀抓包工具——Charles使用
http://my.oschina.net/u/2340880/blog/508688 mac端的优秀抓包工具——Charles使用 一.简介 二.安装与使用 三.使用Charles在mac上进行抓包 ...
- 关于C#怎么固定窗口大小属性详解
原文地址:http://zhidao.baidu.com/link?url=aDqlJMuABC8IxXz5drmZcPIHHlTKX2mrfIpyRZNFp0IAB6RSxT24B2XXMRCK1e ...
- 关于Linux 下 Mysql 远程访问时出现的Access denied for user '用户名'@'IP地址' (using password:NO)
大概是因为MySQL不允许远程访问时候不带密码吧,所以还是设定一个密码 如下这样做: 打开终端 ,即terminal的那个(RedHat5.x为例 在左上角(可能会移位)那个带着红帽的家伙点击,--- ...
- 拦截js方法备忘录
很明显,以下代码拦截了fusion2.dialog.invite,然后在页面执行fusion2.dialog.invite方法的时候修改了参数中的img. <script> var old ...
- third class
09remain timer 1.button的背景改变:放在背景图片里面,改变背景图片的位置,这样更简洁 08 simple clock 1.上下padding一样,居中2.setInterval( ...
- setTimeout 第三个参数 改变setTimeout的作用对象 控制下拉框的关闭
setTimeout第三个参数,可以作为setTimeout延时执行函数的传入参数使用,利用这个设定,我们可以将要延时改变状态的对象传入,变相改变setTimeout的作用对象:这里setTimeou ...