GGTalk——C#开源即时通讯系统源码介绍系列(一)

       坦白讲,我们公司其实没啥技术实力,之所以还能不断接到各种项目,全凭我们老板神通广大!要知道他每次的饭局上可都是些什么人物!

       但是项目接下一大把,就凭咱哥儿几个的水平,想要独立自主、保质保量保期地一个个做出来,那也是有点难以置信。之前咱也跟老板反映过这个困难,建议他再召两个高手过来。不过领导虽然书读的不多,有一句古训倒是背得特别熟——“君子生非异也,善假于物也”。所以咱们公司一直奉行拿来主义。

       园子里的这个GGTalk——C#开源即时通讯系统,咱们前前后后用它移花接木做的IM项目也不下三四个了。初次入手的时候,洋洋代码,多少感觉有些难以把握。不过一来二去,理清了头绪,也就一览无余了。

       相信跟我们一样想要利用GGTalk的同学大有人在,于是我打算写这样一个《GGTalk——C#开源即时通讯系统源码介绍系列》,把自己对GGTalk的梳理分享给大家,让大家更容易上手。

      那接下来我们就言归正传。

一.GGTalk的宏观结构

      

      如图,GGTalk中有4个项目,第一个“GGTalk”是客户端项目;“GGTalk.Core”是客户端和服务端共用的一些类,主要包括一些数据实体,还有一些通信协议类;“GGTalk.Server”是服务端项目;“JustLib”是作者封装的一些常用类和控件。

二.GGTalk是如何实现注册的?

      GGTalk采用Remoting技术来完成注册。

1.先定义接口

namespace GGTalk
{
    /// <summary>
    /// 用于提供注册服务的Remoting接口。
    /// </summary>
    public interface IRemotingService :IChatRecordPersister
    {
        RegisterResult Register(GGUser user); 

        /// <summary>
        /// 根据ID或Name搜索用户【完全匹配】。
        /// </summary>   
        List<GGUser> SearchUser(string idOrName);

        /// <summary>
        /// 发送系统通知给所有在线用户。
        /// </summary>      
        void SendSystemNotify(string title, string content);
    }  
}

2.服务端接口实现

namespace GGTalk.Server
{
    internal class RemotingService :MarshalByRefObject, IRemotingService
    {
        private GlobalCache globalCache;
        private IRapidServerEngine rapidServerEngine;
        public RemotingService(GlobalCache db ,IRapidServerEngine engine)
        {
            this.globalCache = db;
            this.rapidServerEngine = engine;
        }     public RegisterResult Register(GGUser user)
        {
            try
            {
                if (this.globalCache.IsUserExist(user.UserID))
                {
                    return RegisterResult.Existed;
                }
                this.globalCache.InsertUser(user);
                return RegisterResult.Succeed;
            }
            catch (Exception ee)
            {
                return RegisterResult.Error;
            }
        }

        public List<GGUser> SearchUser(string idOrName)
        {
            return this.globalCache.SearchUser(idOrName);
        }

        public override object InitializeLifetimeService()
        {
            return null;
        }     
    }
}

3.服务端发布服务

 #region 发布用于注册的Remoting服务
 RemotingConfiguration.Configure("GGTalk.Server.exe.config", false);
 RemotingService registerService = new Server.RemotingService(globalCache ,Program.RapidServerEngine);
 RemotingServices.Marshal(registerService, "RemotingService");      
 #endregion      

服务端配置文件:

<system.runtime.remoting>
    <application>
      <channels>
        <!--用户注册Remoting服务端口-->
        <channel ref="tcp" port="4500" >
          <serverProviders>
            <provider ref="wsdl" />
            <formatter ref="soap" typeFilterLevel="Full" />
            <formatter ref="binary" typeFilterLevel="Full" />
          </serverProviders>
          <clientProviders>
            <formatter ref="binary" />
          </clientProviders>
        </channel>
      </channels>
    </application>
  </system.runtime.remoting>

4.客户端订阅服务

int registerPort = int.Parse(ConfigurationManager.AppSettings["RemotingPort"]);
this.remotingService = (IRemotingService)Activator.GetObject(typeof(IRemotingService), string.Format("tcp://{0}:{1}/RemotingService", ConfigurationManager.AppSettings["ServerIP"], registerPort)); ;

 三.总结Remoting技术

1.Remoting使用中的三要素:

      1.一个可远程处理的对象。

      2.一个服务端应用程序域用(也叫宿主应用程序域中),于侦听针对该对象的请求。

      3.一个客户端应用程序域,用于发出针对该对象的请求。

2.代理:

      代理是一个提供了和真实对象完全一样的接口、公共方法、属性等成员的对象。在运行过程中,.NET Remoting基于对象元数据生成代理。代理只提供接口,不提供对象的状态,因为对象的真正状态在宿主应用程序域中存储。代理在这里只转发调用。转发调用到一个对象叫封送处理。封送处理的目标是让客户端调用服务端时感觉不到是在与远端对象交流,而是与本地对象在交流。如果通过代理来访问对象,该对象必需是从 MarshalByRefObject抽象类派生。

3.Remoting架构:

      image 

四.知识点拓展

1. 用应用程序域

      操作系统和运行库环境通常会在应用程序间提供某种形式的隔离。例如,Microsoft Windows 使用进程来隔离应用程序。为确保在一个应用程序中运行的代码不会对其他不相关的应用程序产生不良影响,这种隔离是必需的。

      

2.用应用程序域优点

      在一个应用程序中出现的错误不会影响其他应用程序。因为类型安全的代码不会导致内存错误,所以使用应用程序域可以确保在一个域中运行的代码不会影响进程中的其他应用程序。

      能够在不停止整个进程的情况下停止单个应用程序。使用应用程序域使您可以卸载在单个应用程序中运行的代码。

      在一个应用程序中运行的代码不能直接访问其他应用程序中的代码或资源。为了强制实施此隔离,公共语言运行库禁止在不同应用程序域中的对象之间进行直接调用。要在各域之间传递对象,可以复制这些对象,或通过代理访问这些对象。如果复制对象,那么对该对象的调用为本地调用。也就是说,调用方和被引用的对象位于同一应用程序域中。如果通过代理访问对象,那么对该对象的调用为远程调用。在此情况下,调用方和被引用的对象位于不同的应用程序域中。域间调用所采用的远程调用基础结构与两个进程间的调用或两台计算机间的调用的基础结构相同。因此,被引用的对象的元数据必须对于两个应用程序域均可用,以便用 JIT 正确编译该方法调用。如果调用域对被调用对象的元数据没有访问权,则编译可能失败,并引发类型为 System.IO.FileNotFound 的异常。

      代码行为的作用范围由它运行所在的应用程序决定。换言之,应用程序域将提供应用程序版本策略等配置设置、它所访问的任意远程程序集的位置,以及加载到该域中的程序集的位置信息。

      向代码授予的权限可以由代码运行所在的应用程序域来控制。

五.后记

      这是该系列的第一篇,一篇博客篇幅有限,能讲清楚一两个问题已经很不错。要想把GGTalk——C#开源即时通讯系统全部讲透,恐怕得要上百篇博客才够。首先要感谢GGTalk的作者,能够开发出这样优秀的C#开源即时通讯系统,而且无私的开源出来。其次,希望我做的工作也能给大家带来收获,一方面可以方便大家利用GGTalk,另一方面也为学习GGTalk的同学提供一个参考,希望大家可以从中汲取营养,不仅仅是复用这些代码,也能够从中学到蕴含着的知识与技术。

      解读GGTalk,这个工作很辛苦,希望大家鼓励,也希望更多的朋友参与其中!

 

转载于:https://www.cnblogs.com/caojueming/p/6061037.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
<p>GGTalk是QQ的高仿版,包括客户端和服务端,可在广域网部署使用,目前最新版本为4.3。我想写一个类似汇总的文章,通过这篇文章,大家可以了解到GG的全貌和最新进展,以及关于一些常见问题的解答也汇总在这里。</p><p>言归正传,对我个人而言,我的目标并不是做一个QQ高仿版的玩具,而是希望做成一个能够真正使用的产品(这个过程还有很长的路要走),并持续维护下去。</p><p> </p><p>一.已实现的功能</p><p>(01)注册、登录、添加好友、好友列表。</p><p>(02)自拍头像。</p><p>(03)文字聊天、字体设置、GIF动态表情、窗口震动、截图、手写板、登录状态(在线、离开、忙碌、勿打扰、隐身)、输入提醒</p><p>(04)群功能:创建群、加入群、退出群、群聊天</p><p>(05)文件传送、文件夹传送(支持断点续传)</p><p>(06)语音视频聊天</p><p>(07)远程磁盘</p><p>(08)远程协助</p><p>(09)共享桌面(可以指定要共享的桌面区域)</p><p>(10)可靠的P2P</p><p>(11)网盘   </p><p>(12)离线消息</p><p>(13)离线文件</p><p>(14)托盘闪动:跟QQ完全一样,当接收到消息时,托盘会闪动对应好友的头像。点击头像,将弹出与好友的聊天框。</p><p>(15)最近联系人列表</p><p>(16)系统设置:开机自动启动、麦克风设备索引、摄像头设备索引,叉掉主窗口时关闭程序还是隐藏窗口。</p><p>(17)聊天记录:支持本地保存和服务器端保存两种方式。</p><p>(18)好友分组:新增/删除分组,修改分组名称,改变好友的所属分组。</p><p>(19)打开聊天窗口时,自动显示上次交谈的最后一句话。</p><p>(20)输入提醒:像QQ一样,当对方正在输入消息时,我这边的聊天框可以看到对方“正在输入”的提示。</p><p>(21)自动记录:GG2014会自动记录上次打开的主界面的位置、大小;最后一次打开的聊天窗口的大小;最后一次设定的字体的颜色、大小等。 </p><p>(22)主窗体靠边自动隐藏。</p><p>(23)录制视频聊天。</p><p> </p><p>二.后续待实现的功能</p><p>(1)增加持久化支持</p><p>(2)视频会议</p><p> </p><p>三.GGTalk开发环境</p><p>开发环境:VS2010 ,开发语言:C#, .NET Framework 版本: 2.0 </p><p>部署客户端时,客户端机器还需要安装VC++2008 runtime、VC++2010 runtime。</p><p> </p><p>四.GGTalk相关说明</p><p>1.如果要将GG部署到广域网,则可以在服务端的配置文件中设置监听的端口;而在客户端的配置文件中,则可以指定服务器的IP和Port。</p><p>2.虚拟数据库</p><p>(1)为了部署测试更简单,GG没有采用真实的物理数据库,而是在内存中虚拟了一个数据库(即服务端的VirtualDB类),用于存储用户注册信息、好友关系、群信息等。</p><p>(2)GG内置了几个用户:10000、10001、10002、10003,它们的登录密码都是"1"。</p><p>(3)GG内置的这几个用户之间都是好友关系。</p><p>(4)GG内置了两个群:G001、G002。G001群包含所有内置测试用户,G002群包含10000和10001两个用户。</p><p>(5)上述的这些内置信息,在VirtualDB类的构造函数中设定。</p><p>3.麦克风、摄像头的选择可在客户端系统设置窗口(SystemSettingForm)中指定。</p><p>4.语音视频:也有很多朋友问语音视频设备的工作怎么不正常,或者语音视频不流畅,这个可以直接参考OMCS官方文档:摄像头、麦克风、扬声器、设备测试 、带宽要求。</p><p>5.特别说明一下:GG项目中,只要是我写的代码,全部都放出来了。拜托喜欢每一个dll都有码的朋友不要再问我要其它的码了:) </p>
GG即时通讯系统GGTalk部署版简介 GG即时通讯系统GGTalk,包括客户端、服务端、数据库,可在广域网部署使用。支持:文字/语音/视频聊天,文件传送,离线文件,离线消息,视频会议,性能稳定,绝不是一个玩具或demo。 GG即时通讯系统GGTalk部署版已实现的功能: (01)注册、登录、查找用户、添加好友、好友列表。 (02)自拍头像。 (03)文字聊天、字体设置、GIF动态表情、窗口震动、截图、手写板、登录状态(在线、离开、忙碌、勿打扰、隐身)、输入提醒 (04)群功能:创建群、加入群、退出群、群聊天 (05)文件传送、文件夹传送(支持断点续传) (06)语音视频聊天 (07)远程磁盘 (08)远程协助 (09)共享桌面(可以指定要共享的桌面区域) (10)可靠的P2P (11)网盘 (12)离线消息 (13)离线文件 (14)托盘闪动:跟QQ完全一样,当接收到消息时,托盘会闪动对应好友的头像。点击头像,将弹出与好友的聊天框。 (15)最近联系人列表 (16)系统设置:开机自动启动、麦克风设备索引、摄像头设备索引,叉掉主窗口时关闭程序还是隐藏窗口。 (17)聊天记录:支持本地保存和服务器端保存两种方式。 (18)好友分组:新增/删除分组,修改分组名称,改变好友的所属分组。 (19)打开聊天窗口时,自动显示上次交谈的最后一句话。 (20)输入提醒:像QQ一样,当对方正在输入消息时,我这边的聊天框可以看到对方“正在输入”的提示。 (21)自动记录:GG2014会自动记录上次打开的主界面的位置、大小;最后一次打开的聊天窗口的大小;最后一次设定的字体的颜色、大小等。 (22)主窗体靠边自动隐藏。 (23)录制视频聊天。 (24)支持数据库(SqlServer 2000/2005/2008),并可以通过配置在真实数据库和虚拟数据库之间自由切换。 (25)语音视频设备测试 (26)聊天消息加密 GG即时通讯系统GGTalk v5.5 部署版更新日志 增加对MySQL数据库的支持。 已实现的功能: GG即时通讯系统GGTalk部署版页面展示 相关阅读 同类推荐:站长常用
GG即时通讯系统GGTalk,包括客户端、服务端、数据库,可在广域网部署使用。支持:文字/语音/视频聊天,文件传送,离线文件,离线消息,视频会议,性能稳定,绝不是一个玩具或demo。GG即时通讯系统GGTalk 7.0 码版 更新日志:2020-09-30全新的服务端+PC端+Android端,Android端功能基本已经完整。已实现的功能:(01)注册、登录、查找用户、添加好友、好友列表。(02)自拍头像。(03)文字聊天、字体设置、GIF动态表情、窗口震动、截图、手写板、登录状态(在线、离开、忙碌、勿打扰、隐身)、输入提醒(04)群功能:创建群、加入群、退出群、群聊天(05)文件传送、文件夹传送(支持断点续传)(06)语音视频聊天(07)远程磁盘(08)远程协助(09)共享桌面(可以指定要共享的桌面区域)(10)可靠的P2P(11)网盘   (12)离线消息(13)离线文件(14)托盘闪动:跟QQ完全一样,当接收到消息时,托盘会闪动对应好友的头像。点击头像,将弹出与好友的聊天框。(15)最近联系人列表(16)系统设置:开机自动启动、麦克风设备索引、摄像头设备索引,叉掉主窗口时关闭程序还是隐藏窗口。(17)聊天记录:支持本地保存和服务器端保存两种方式。(18)好友分组:新增/删除分组,修改分组名称,改变好友的所属分组。(19)打开聊天窗口时,自动显示上次交谈的最后一句话。(20)输入提醒:像QQ一样,当对方正在输入消息时,我这边的聊天框可以看到对方“正在输入”的提示。(21)自动记录:GG2014会自动记录上次打开的主界面的位置、大小;最后一次打开的聊天窗口的大小;最后一次设定的字体的颜色、大小等。 (22)主窗体靠边自动隐藏。(23)录制视频聊天。(24)支持数据库(SqlServer2000/2005/2008),并可以通过配置在真实数据库和虚拟数据库之间自由切换。 (25)语音视频设备测试   (26)聊天消息加密
GG即时通讯系统GGTalk,包括客户端、服务端、数据库,可在广域网部署使用。支持:文字/语音/视频聊天,文件传送,离线文件,离线消息,视频会议,性能稳定,绝不是一个玩具或demo。GG即时通讯系统GGTalk 6.2 码版 更新日志:2019-01-03PC版修复bug:更新组成员时,没有更新组的version;修复MySQL分页错误,以及查询聊天记录错误;Android版:增加好友在线状态、群聊等功能。已实现的功能:(01)注册、登录、查找用户、添加好友、好友列表。(02)自拍头像。(03)文字聊天、字体设置、GIF动态表情、窗口震动、截图、手写板、登录状态(在线、离开、忙碌、勿打扰、隐身)、输入提醒(04)群功能:创建群、加入群、退出群、群聊天(05)文件传送、文件夹传送(支持断点续传)(06)语音视频聊天(07)远程磁盘(08)远程协助(09)共享桌面(可以指定要共享的桌面区域)(10)可靠的P2P(11)网盘   (12)离线消息(13)离线文件(14)托盘闪动:跟QQ完全一样,当接收到消息时,托盘会闪动对应好友的头像。点击头像,将弹出与好友的聊天框。(15)最近联系人列表(16)系统设置:开机自动启动、麦克风设备索引、摄像头设备索引,叉掉主窗口时关闭程序还是隐藏窗口。(17)聊天记录:支持本地保存和服务器端保存两种方式。(18)好友分组:新增/删除分组,修改分组名称,改变好友的所属分组。(19)打开聊天窗口时,自动显示上次交谈的最后一句话。(20)输入提醒:像QQ一样,当对方正在输入消息时,我这边的聊天框可以看到对方“正在输入”的提示。(21)自动记录:GG2014会自动记录上次打开的主界面的位置、大小;最后一次打开的聊天窗口的大小;最后一次设定的字体的颜色、大小等。 (22)主窗体靠边自动隐藏。(23)录制视频聊天。(24)支持数据库(SqlServer2000/2005/2008),并可以通过配置在真实数据库和虚拟数据库之间自由切换。 (25)语音视频设备测试   (26)聊天消息加密

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值