可在广域网部署运行的QQ高仿版 -- GG叽叽V3.2,增加离线消息、离线文件功能(源码)
(几句题外话:虽然就如何将GG发展为一个有商业价值的产品,我还没有很清晰明确的思路,但是从GG发布以来,通过GG认识了一些朋友,也接了一些小单子,赚了一点小钱。有了一点甜头,目前和2、3个好朋友一起做做小项目也是不错的,这未尝不是一条养家糊口之路了?呵呵)
距离上次更新(GG叽叽V3.0,完善基础功能)正好有1个月了,在这个月中,我主要为GG增加了离线消息和离线文件的功能。之所以将这两个功能提前实现,是因为至GG发布以来,就有很多朋友问我在GG的基础上如何实现离线消息和离线文件。看来作为一个能用的IM软件,离线消息和离线文件是必备的基础功能了。
一.GG V3.2 新增功能展现
(1)离线消息。
(2)离线文件。
(3)以前功能的几个bug修改。
废话不多说,还是先上图。
离线消息:
发送离线文件:
离线文件发送完成、接收完成:
二.实现思路
虽然提供了源代码,但是,我还是想将主要的思路列一下,这样,大家理解起源码来,会节省更多的时间。
1. GG V3.2仍然使用的是在内存虚拟的数据库VirtualDB类,并且在其中增加了两个表:offlineMessageTable、offlineFileTable,分别用于存储离线消息和离线文件条目信息。
如果使用真实的数据库,移植也是很简单的,只需要将VirtualDB的所有方法重写,并与真实的数据库交互即可。
2. 在服务端增加了OfflineMessageController类,用于管理离线消息。
3. 在服务端增加了OfflineFileController类,用于管理离线文件。注意:GG将要中转的离线文件是保存在服务端运行目录下的OfflineFiles文件夹下(可在OfflineFileController源码中修改这个路径)。
4. 需特别提醒是,网盘功能和离线文件功能的实现都用到了一个非常重要的字段,TransferingProject的Comment属性:
(1)TransferingProject的Comment属性对应着方法BeginSendFile(用于请求发送文件)的comment参数。
(2)在网盘的功能中,comment用于表示上传或下载时存储的路径,GGLib项目中的Comment4NDisk静态类用于支持这一点。
(3)在离线文件功能中,comment用于表示发送者或接收者的UserID,GG.Core项目中的Comment4OfflineFile静态类用于支持这一点。
5.离线消息基本逻辑要点:通过预定IRapidServerEngine的CustomizeController属性的TransmitFailed事件,来取得所有转发失败的消息,并只关注其中的聊天消息。
6.离线文件基本逻辑要点:
(1)当客户端登录成功并完成初始化后,会向服务器发送两个请求消息(位于MainForm的MainForm_Load方法):InformationTypes.GetOfflineMessage、InformationTypes.GetOfflineFile。
(2)服务端接收到上述两个请求后,会调用OfflineMessageController和OfflineFileController来分分别处理。(位于CustomizeHandler类的HandleInformation方法)
(3)无论客户端(作为接收者)是接收完了离线文件、还是拒绝了离线文件,服务端都会发送一个InformationTypes.OfflineFileResultNotify消息通知离线文件的发送方。
三.GG V3.2 源码下载
下载最新版本,请转到这里。
注:GG使用VS2010编译生成的GG.exe文件,这个文件经常被新毒霸误报为病毒,所以,这次发布的压缩包中我把客户端生成的GG.exe删除了,大家可以自己编译生成它。
关于GG的最新全貌介绍,我单独写了一篇文章,作为汇总,可参见 可在广域网部署运行的QQ高仿版 -- GG2013概要。
欢迎和我探讨关于GG2013的一切,我的QQ:2027224508,多多交流!
大家有什么问题和建议,可以留言,也可以发送email到我邮箱:ggim2013@163.com。
如果你觉得还不错,请粉我,顺便再顶一下啊,呵呵