千呼万唤始出来!—— 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虽短,可是这做起来真难,好吧因 ...
随机推荐
- [转]学术型 github 畅想
转自 http://wulfric.me/2013/09/github-and-academy/ 以 github 的精神提供学术服务,也许是一个不错的方向. 什么是 github? Github 是 ...
- 我利用网上代码开发的JQuery图片插件
我利用网上代码开发的JQuery图片插件 代码如下 (function($){ $.fn.FocusPic = function(options){ var defaults = { interval ...
- MySQL 5.6 & 5.7最优配置模板
摘自:http://mp.weixin.qq.com/s?__biz=MjM5MjIxNDA4NA==&mid=207854835&idx=1&sn=c998031ae6816 ...
- Loadrunner,将http请求返回的中文结果打印出来
Loadrunner 做保险承保业务测试 1. 保险正常业务流程:保费计算--->保存--->申请核保--->核保--->缴费(出保单) 问题描述: 脚本录制,参数化完成后,R ...
- aa12
option = { backgroundColor: '#1b1b1b', color: ['gold','aqua','lime'], title : { text: '模拟迁徙', subtex ...
- 121. Best Time to Buy and Sell Stock (一) leetcode解题笔记
121. Best Time to Buy and Sell Stock Say you have an array for which the ith element is the price of ...
- OVER 分析函数
over不能单独使用,要和分析函数:rank(),dense_rank(),row_number(),ntile ,sum(),avg()等一起使用. rank,dense_rank,row_numb ...
- sqlite3 根据实体自动生成建表语句
public class BuildSqlTool { public static string GetCreateTableSql(object t) { //CREATE TABLE &quo ...
- 关于公司VPN专线接入的一个案例
最近互通网络技术部门收到一到封邮件,是关于公司VPN接入的问题,问题如下: 条件:A区为办公地点1,其他办公电脑20台,并通过写字楼的宽带接口联通外网. B区为新办公地点2,预设应用.数据库.备份服务 ...
- 禁止VMware虚拟机与Host的时间同步
禁止VMware虚拟机与Host的时间同步 1. 查看虚拟机是否安装了 VMware Tools, 如果有安装,则将 VMware Tools 属性窗口的“选项”-->“其他选项”中“虚拟机与宿 ...