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

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

园子里的这个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架构:

四.知识点拓展

1. 用应用程序域

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

2.用应用程序域优点

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

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

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

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

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

五.后记

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

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

GGTalk——C#开源即时通讯系统源码介绍系列(一)的更多相关文章

  1. GGTalk ——C#开源即时通讯系统

    http://www.cnblogs.com/justnow/ GGTalk ——C#开源即时通讯系统 下载中心   GGTalk(简称GG)是可在广域网部署运行的QQ高仿版,2013.8.7发布GG ...

  2. 新一代开源即时通讯应用源码定制 运营级IM聊天源码

    公司介绍:我们是专业的IM服务提供商!哇呼Chat是一款包含android客户端/ios客户端/pc客户端/WEB客户端的即时通讯系统.本系统完全自主研发,服务器端源码直接部署在客户主机.非任何第三方 ...

  3. 即时通信系统中实现全局系统通知,并与Web后台集成【附C#开源即时通讯系统(支持广域网)——QQ高仿版IM最新源码】

    像QQ这样的即时通信软件,时不时就会从桌面的右下角弹出一个小窗口,或是显示一个广告.或是一个新闻.或是一个公告等.在这里,我们将其统称为“全局系统通知”.很多使用C#开源即时通讯系统——GGTalk的 ...

  4. 即时通信系统中实现聊天消息加密,让通信更安全【低调赠送:C#开源即时通讯系统(支持广域网)——GGTalk4.5 最新源码】

    在即时通讯系统(IM)中,加密重要的通信消息,是一个常见的需求.尤其在一些政府部门的即时通信软件中(如税务系统),对即时聊天消息进行加密是非常重要的一个功能,因为谈话中可能会涉及到机密的数据.我在最新 ...

  5. HoverTree系统源码介绍

    HoverTree是一个开源asp.net系统.系统的效果请到:http://hovertree.com体验. 源码描述:一.源码特点采用典型的三层架构进行开发,实现了留言板的功能,后台管理,留言审核 ...

  6. 安卓系统源码编译系列(六)——单独编译内置浏览器WebView教程

    原文                   http://blog.csdn.net/zhaoxy_thu/article/details/18883015                 本文主要对从 ...

  7. 可在广域网部署运行的即时通讯系统 -- GGTalk总览(附源码下载)

      (最新版本:V6.2,2019.01.03 .Xamarin移动端版本已经推出,包括 Android 和 iOS) GGTalk开源即时通讯系统(简称GG)是QQ的高仿版,同时支持局域网和广域网, ...

  8. 【转】可在广域网部署运行的即时通讯系统 -- GGTalk总览(附源码下载)

    原文地址:http://www.cnblogs.com/justnow/p/3382160.html (最新版本:V6.0,2017.12.11 .即将推出Xamarin移动端版本,包括 Androi ...

  9. GGTalk即时通讯系统(支持广域网)终于有移动端了!(技术原理、实现、源码)

    首先要感谢大家一直以来对于GGTalk即时通讯系统的关注和支持!GGTalk即时通讯系统的不断完善与大家的支持分不开! 从2013年最初的GG1.0开放源码以来,到后来陆续增加了网盘功能.远程协助功能 ...

随机推荐

  1. Asp.Net网站的的编译与发布原理

    如下所示创建一个简单的asp.Net Web应用程序                     在VS中生成解决方案之后,可以在项目的目录下看到以下的文件:                       ...

  2. VC2010 配置OpenGL环境(转)

    转自http://www.cnblogs.com/longdouhzt/archive/2012/02/13/2350094.html OpenGL开发环境简介 基于OpenGL标准开发的应用程序运行 ...

  3. HBase HA的分布式集群部署(适合3、5节点)

    本博文的主要内容有: .HBase的分布模式(3.5节点)安装    .HBase的分布模式(3.5节点)的启动 .HBase HA的分布式集群的安装 .HBase HA的分布式集群的启动    .H ...

  4. iptables.md

    iptables基本概念 工作流程 1.一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转发出去. 2.如果数据包就是进入本机的,它就会沿着图向下移动,到达I ...

  5. 经验总结13--EF配置

    EF配置,开发前的准备及步骤. 使用V22013和EF6.1. 1.使用VS新建MVC项目. 2.创建实体类. 3.配置web.config的数据库链接字符串. <connectionStrin ...

  6. BZOJ1189:[HNOI2007]紧急疏散EVACUATE(最大流,枚举)

    Description 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一 块空地:如果是'X',那么表示这是一面墙,如果是'D',那么表示这是 ...

  7. 集合之hascode方法

    在前面三篇博文中LZ讲解了(HashMap.HashSet.HashTable),在其中LZ不断地讲解他们的put和get方法,在这两个方法中计算key的hashCode应该是最重要也是最精华的部分, ...

  8. js 操作字典

    有时候我们进行ajax请求的时候,列表并不满足我们需求,有时候需要 key :value形式. 如果还按照python的定义: var data={}; data[tag_id][tag_ch_id] ...

  9. USB耳机声卡-音频输入/输出控制器:DP108替代兼容CM108

    DP108是一款完全替代CM108的高度集成的单芯片USB音频解决方案芯片.方便的USB即插即用的兼容性,用户可以快速创建易用性,高质量和便携式USB音频产品基于高度集成的单芯片解决方案.所有重要的模 ...

  10. Selenium 设置代理chrome

    1.1. 连接无用户名密码认证的代理 from selenium import webdriver chromeOptions = webdriver.ChromeOptions() chromeOp ...