【转】GGTalk即时通讯系统(支持广域网)终于有移动端了!(技术原理、实现、源码)
原文地址:http://www.cnblogs.com/justnow/p/4836636.html
首先要感谢大家一直以来对于GGTalk即时通讯系统的关注和支持!GGTalk即时通讯系统的不断完善与大家的支持分不开! 从2013年最初的GG1.0开放源码以来,到后来陆续增加了网盘功能、远程协助功能、离线文件功能、群聊功能、语音聊天功能、视频聊天功能、以及视讯录制功能、和增加了数据库——一路走来,结识许多朋友,大家不仅对GGTalk即时通讯系统的源码提了许多宝贵的建议,我还有幸与某些朋友取得了项目上的合作,这一切都是美妙的缘分!
一直以来,GGTalk即时通讯系统的移动端始终是一个缺憾。前段时间刚好结识了一位做android开发的朋友,他也很有兴趣参与,于是GGTalk即时通讯系统的移动端也借此契机而诞生了!
本文我主要是想为大家介绍一下打通PC端和移动端背后的基本原理,并以GGTalk即时通讯系统的android版作为示例demo供大家参考。当然,这个demo只是完成了GGTalk客户端全部功能的一小部分,以后我们会陆续将更完善的版本分享给大家。
想要直接下载体验的朋友请点击:“下载中心”
一.先睹为快
本次的GGTalk即时通讯系统安卓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安卓版的源码详细研究,在此就不赘述了。
四.GGTalk即时通讯系统源码放送
下载最新版本,请转到这里。
大家有什么问题和建议,敬请留言,也可以发送email到我邮箱:2027224508@qq.com。
如果大家觉得还不错,请粉我,顺便再顶一下啊!
【转】GGTalk即时通讯系统(支持广域网)终于有移动端了!(技术原理、实现、源码)的更多相关文章
- GGTalk即时通讯系统(支持广域网)终于有移动端了!(技术原理、实现、源码)
首先要感谢大家一直以来对于GGTalk即时通讯系统的关注和支持!GGTalk即时通讯系统的不断完善与大家的支持分不开! 从2013年最初的GG1.0开放源码以来,到后来陆续增加了网盘功能.远程协助功能 ...
- IM即时通讯设计 高并发聊天服务:服务器 + qt客户端(附源码)
来源:微信公众号「编程学习基地」 目录 IM即时通信程序设计 IM即时通讯 设计一款高并发聊天服务需要注意什么 如何设计可靠的消息处理服务 什么是粘包 什么是半包 解决粘包和半包 IM通信协议 应用层 ...
- 即时通信系统中实现全局系统通知,并与Web后台集成【附C#开源即时通讯系统(支持广域网)——QQ高仿版IM最新源码】
像QQ这样的即时通信软件,时不时就会从桌面的右下角弹出一个小窗口,或是显示一个广告.或是一个新闻.或是一个公告等.在这里,我们将其统称为“全局系统通知”.很多使用C#开源即时通讯系统——GGTalk的 ...
- 【转】可在广域网部署运行的即时通讯系统 -- GGTalk总览(附源码下载)
原文地址:http://www.cnblogs.com/justnow/p/3382160.html (最新版本:V6.0,2017.12.11 .即将推出Xamarin移动端版本,包括 Androi ...
- 可在广域网部署运行的即时通讯系统 -- GGTalk总览(附源码下载)
(最新版本:V6.2,2019.01.03 .Xamarin移动端版本已经推出,包括 Android 和 iOS) GGTalk开源即时通讯系统(简称GG)是QQ的高仿版,同时支持局域网和广域网, ...
- 即时通信系统中实现聊天消息加密,让通信更安全【低调赠送:C#开源即时通讯系统(支持广域网)——GGTalk4.5 最新源码】
在即时通讯系统(IM)中,加密重要的通信消息,是一个常见的需求.尤其在一些政府部门的即时通信软件中(如税务系统),对即时聊天消息进行加密是非常重要的一个功能,因为谈话中可能会涉及到机密的数据.我在最新 ...
- GGTalk ——C#开源即时通讯系统
http://www.cnblogs.com/justnow/ GGTalk ——C#开源即时通讯系统 下载中心 GGTalk(简称GG)是可在广域网部署运行的QQ高仿版,2013.8.7发布GG ...
- GGTalk——C#开源即时通讯系统源码介绍系列(一)
坦白讲,我们公司其实没啥技术实力,之所以还能不断接到各种项目,全凭我们老板神通广大!要知道他每次的饭局上可都是些什么人物! 但是项目接下一大把,就凭咱哥儿几个的水平,想要独立自主.保质保量保期地一个个 ...
- 视酷即时通讯系统应用源码 V1.0
视酷即时通讯系统(原创),成熟稳定,拥有和微信一样强大的功能不再是梦,节省几个月研发时间迅速融合进项目中: 1.首家支持聊天室群聊 2.支持和微信一样的语音聊天,可以显示时长.未读状态,自动轮播未读语 ...
随机推荐
- BZOJ 3524 [Poi2014]Couriers(二分+蒙特卡罗)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3524 [题目大意] 给一个长度为n的序列a.1≤a[i]≤n. m组询问,每次询问一个 ...
- 【推导】AtCoder Regular Contest 082 D - Derangement
题意:给你一个排列a,每次可以交换相邻的两个数.让你用最少的交换次数使得a[i] != i. 对于两个相邻的a[i]==i的数,那么一次交换必然可以使得它们的a[i]都不等于i. 对于两个相邻的,其中 ...
- [NOIp2016提高组]天天爱跑步
题目大意: 有一棵n个点的树,每个点上有一个摄像头会在第w[i]秒拍照. 有m个人再树上跑,第i个人沿着s[i]到t[i]的路径跑,每秒钟跑一条边. 跑到t[i]的下一秒,人就会消失. 问每个摄像头会 ...
- HDU 5289 Assignment rmq
Assignment 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5289 Description Tom owns a company and h ...
- WEB.NET error:请添加一个名为 jquery (区分大小写)的 ScriptResourceMapping 解决方案
参考 http://blog.csdn.net/kisscatforever/article/details/50579935 今天用了一个组件 一个验证型的组件. 然后出现了这个问题. 我看了网上一 ...
- 【JSP EL】使用EL表达式比较 动态选中 select中的option
<option value="${k.key }" ${KPIThis.parent.parent.thisId == k.key ? "selected" ...
- 二、spring-boot文件配置
项目文件结构,新建的Springboot项目的文件结构如下: |-customer(项目名称) | - sec | | - main | | | - java | | | - resources | ...
- [Todo]各种语言包管理工具
看到一篇文章不错: http://harttle.com/2015/05/29/pkg-manager.html 包管理和构建系统是现代的软件开发团队中必不可少的工具,也是Linux软件系统的常见组织 ...
- php.in
[PHP] ;;;;;;;;;;; ; WARNING ; ;;;;;;;;;;; ; This is the default settings file for new PHP installati ...
- SQL如何将EXCEL导入到SQL数据库
1 新建一个EXCEL工作表,注意默认有三个工作簿,我们只在Sheet1中创建几个字段并存储若干值保存为TEST.xls 2运行Excel to MySQL软件,注意Sourece和Destinati ...