千呼万唤始出来!—— 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虽短,可是这做起来真难,好吧因 ...
随机推荐
- JSONP跨域的原理解析( 一种脚本注入行为)
JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制, 被称为“some-Origin Policy”(同源策略).这一策略对于Jav ...
- jfreechart 整合sturts2牛刀小试
一.增加的jar包 struts2-jfreechart-plugin-2.1.6.jar 在struts2的相应jar包中找 jcommon-1.0.23.jar ...
- Codeforces 586D. Phillip and Trains 搜索
D. Phillip and Trains time limit per test: 1 second memory limit per test :256 megabytes input: stan ...
- aa2
option = { series : [ { name: 'Map', type: 'map', mapLocation: { x : 'left', y : 'top', height : 500 ...
- Windows下解压版mysql的安装方法
1 首先下载mysql的解压版的rar安装包 1 将安装包解压到安装路径.C:\Program Files (x86)\MySQL2 将安装路径下的bin追加到环境变量"PATH" ...
- 解决chrome和IE样式兼容问题
在页面title中加入: <meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible"> ...
- 怎样防止重复发送 Ajax 请求?
著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:长天之云链接:http://www.zhihu.com/question/19805411/answer/15465427来源 ...
- yii隐藏域的使用方法
<?= $form->field($model, 'time')->textInput()->hiddenInput(['value'=>time()])->lab ...
- 三道关于Taylor级数的题目,证明你爹是你爹
=============幂级数的唯一性==================
- [转]MySQL关键性能监控(QPS/TPS)
原文链接:http://www.cnblogs.com/chenty/p/5191777.html 工作中尝尝会遇到各种数据库性能调优,除了查看某条SQL执行时间长短外,还需要对系统的整体处理能力有更 ...