首先要感谢大家一直以来对于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)终于有移动端了!(技术原理、实现、源码)的更多相关文章

  1. android采用MVP完整漫画APP、钉钉地图效果、功能完善的音乐播放器、仿QQ动态登录效果、触手app主页等源码

    Android精选源码 一个可以上拉下滑的Ui效果,觉得好看可以学学 APP登陆页面适配 一款采用MVP的的完整漫画APP源码 android实现钉钉地图效果源码 一个使用单个文字生成壁纸图片的app ...

  2. Socket实现仿QQ聊天(可部署于广域网)附源码(4)-加入数据库系统搭建完成

    1.前言 这是本系列的第四篇文章,上一篇我们讲到实现了客户端对客户端的抖屏与收发各种类型文件,本篇文章我们加入SQLServer数据库实现登录与好友的添加等功能,并对界面做了美化处理.向往常一样我会把 ...

  3. Socket实现仿QQ聊天(可部署于广域网)附源码(1)-简介

    1.前言 本次实现的这个聊天工具是我去年c#程序设计课程所写的Socket仿QQ聊天,由于当时候没有自己的服务器,只能在机房局域网内进行测试,最近在腾讯云上买了一台云主机(本人学生党,腾讯云有个学生专 ...

  4. Socket实现仿QQ聊天(可部署于广域网)附源码(2)-服务器搭建

    1.前言 这是本系列的第二篇文章,第一篇文章得到了很多朋友们的支持,在这里表示非常的感谢.对于这一系列文章需要补充的是这只是一篇入门级别的Socket通信文章,对于专业人员来说完全可以跳过.本文只介绍 ...

  5. 高仿QQ即时聊天软件开发系列之三登录窗口用户选择下拉框

    上一篇高仿QQ即时聊天软件开发系列之二登录窗口界面写了一个大概的布局和原理 这一篇详细说下拉框的实现原理 先上最终效果图 一开始其实只是想给下拉框加一个placeholder效果,让下拉框在未选择未输 ...

  6. 高仿QQ即时聊天软件开发系列之一开端

    前段时间在园子里看到一个大神做了一个GG2014IM软件,仿QQ的,那感觉···,赶快下载源码过来试试,还真能直接跑起来,效果也不错.但一看源码,全都给封装到了ESFramework里面了,音视频那部 ...

  7. 史上最简单,一步集成侧滑(删除)菜单,高仿QQ、IOS。

    重要的话 开头说,not for the RecyclerView or ListView, for the Any ViewGroup. 本控件不依赖任何父布局,不是针对 RecyclerView. ...

  8. Android实现高仿QQ附近的人搜索展示

    本文主要实现了高仿QQ附近的人搜索展示,用到了自定义控件的方法 最终效果如下 1.下面展示列表我们可以使用ViewPager来实现(当然如果你不觉得麻烦,你也可以用HorizontalScrollVi ...

  9. 高仿QQ的即时通讯应用带服务端软件安装

    Android 基于xmpp协议,smack包,openfire服务端(在下面)的高仿QQ的即时通讯实现.实现了注册,登录,读取好友列表,搜索好友,添加分组,添加好友,删除好友,修改心情,两个客户端之 ...

  10. 高仿QQ即时聊天软件开发系列之二登录窗口界面

    继上一篇高仿QQ即时聊天软件开发系列之一开端之后,开始做登录窗口 废话不多说,先看效果,只有界面 可能还有一些细节地方没有做,例如那个LOGO嘛,不要在意这些细节 GIF虽短,可是这做起来真难,好吧因 ...

随机推荐

  1. Archlinux 上 Nginx + PHP + Mariadb + DiscuzX2.5 安装小记

    因为不好找下载集成服务器工具,而且他们自己又打包了一份 php 之类的程序,本身系统就已经有 php 还有数据库什么的了再搞一份受不了,最后选择了手动配置…… 这是一个在 Archlinux 上手动从 ...

  2. --with-http_realip_module选项(后台Nginx服务器记录原始客户端的IP地址 )

    转自:http://blog.itpub.net/27043155/viewspace-734234/ 通过这个模块允许我们改变客户端请求头中客户端IP地址值(例如,X-Real-IP 或 X-For ...

  3. 求两个集合的交集和并集C#

    我是用hashset<T>来实现的 具体如代码所示 using System; using System.Collections.Generic; using System.Linq; u ...

  4. 深入研究C语言 第三篇

    本篇研究TC2.0下其他几个工具.同时看看TC由源代码到exe程序的过程. 1. 用TCC将下面的程序编为.obj文件 我们知道,TCC在默认的编译连接一个C语言的源程序a.c的时候分为以下两步: ( ...

  5. HTML流动布局各种宽度自适应

    <!DOCTYPE html> <html lang="en"> <style> html,body{ padding: 0;margin: 0 ...

  6. Java 第27章 JDBC

    JDBC 模版 JDBC 的工作原理 JDBC API 提供者:Sun公司 内容:供程序员调用的接口与类,集成在java.sql 和javax.sql 包中,如: DriverManager 类 Co ...

  7. Git常用

    创建本地库 mkdir [dirname] cd [dirname] git init 1.创建项目目录 2.进入目录 3.git初始化 [dirname]为自己取的文件夹名字,例如mkdir myd ...

  8. 用eclipse搭建SSH(struts+spring+hibernate)框架

    声明: 本文是个人对ssh框架的学习.理解而编辑出来的,可能有不足之处,请大家谅解,但希望能帮助到大家,一起探讨,一起学习! Struts + Spring + Hibernate三者各自的特点都是什 ...

  9. viewpage滑动查看图片并再有缩略图预览

    首先看下效果图, 主要功能分为3大块 一是滑动查看,通过viewpage来实现,方法见 http://www.cnblogs.com/lovemo1314/p/6109312.html 二.点击放大 ...

  10. 算法入门笔记------------Day3

    主要是复习前面的基本内容,以及函数的概念 组合数 #include<stdio.h> int f(int n) { int m=1; for(int i=1;i<=n;i++) m* ...