.NET Remoting

 

.NET Remoting是微软早期的分布式通信技术,虽然微软后来通过WCF通用基础通信框架整合掉了,但是通过回顾学习Remoting,反过来学习理解WCF也是很有帮助的。同时通过这篇博客的学习,可以看到Remoting技术的魅力。

先看一段Wiki百科对于WCF技术的概述。其中就提到了WCF、Web Service、Remoting、Socket等技术。在我提到这些名词的同时,你应该对这些技术有所了解并清楚这些技术所处于的层次。

Windows Communication Foundation (WCF)是由微软发展的一组数据通信的应用程序开发接口,它是.NET框架的一部分,由.NET Framework 3.0开始引入,与Windows Presentation Foundation及 Windows Workflow Foundation并行为新一代Windows操作系统以及WinFX的三个重大应用程序开发类库。

在.NET Framework 2.0以及前版本中,微软发展了Web Service(SOAP with HTTP communication),.NET Remoting(TCP/HTTP/Pipeline communication)以及基础的Winsock等通信支持,由于各个通信方法的设计方法不同,而且彼此之间也有相互的重叠性(例如.NET Remoting可以开发SOAP, HTTP通信),对于开发人员来说,不同的选择会有不同的程序设计模型,而且必须要重新学习,让开发人员在用户有许多不便。同时,服务导向架构(Service-Oriented Architecture)也开始盛行于软件工业中,因此微软重新查看了这些通信方法,并设计了一个统一的程序开发模型,对于数据通信提供了最基本最有弹性的支持,这就是Windows Communication Foundation。

其实在早期,还有一些其它的通信技术,比如:MSMQ(消息队列)、COM、COM+、DCOM等。COM是微软的重大发明,将复杂的通信细节封装到一个一个的COM组件中,让.NET程序员可以不用关心复杂的通信细节,只用操作通信模型就可以实现交互操作。

简单介绍就到这,回过头来看看Remoting的通信架构图:

从架构图可以看到,Remoting可以以对象代理的方式直接操作服务器端的对象的方法。

下面建一个最基本的项目来演示一下Remoting的使用。

先看一下项目的架构:

RemotingServer是一个Remoting服务端控制台项目;RemotingClient是一个Remoting客户端控制台项目;RemotingService是一个类库项目。

RemotingServer和RemotingClient都需要引用System.Runtime.Remoting这个组件。并且引用RemotingService这个类库项目。

RemotingServer中的代码:

    static void Main(string[] args)
{
TcpServerChannel channel = new TcpServerChannel(8888);
ChannelServices.RegisterChannel(channel, false);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(PersonIDConverter), "Hi", WellKnownObjectMode.SingleCall);
Console.WriteLine("Remoting服务已经启动");
Console.ReadLine();
}

RemotingClient中的代码:

    static void Main(string[] args)
{
ChannelServices.RegisterChannel(new TcpClientChannel(), false);
PersonIDConverter service = (PersonIDConverter)Activator.GetObject(typeof(PersonIDConverter), "tcp://localhost:8888/Hi");
if (!object.Equals(service, null))
{
Console.WriteLine(service.PersonID15To18("130503670401001"));//测试身份证号
}
Console.ReadLine();
}

PersonIDConverter中的代码:

  /// <summary>
/// 远程服务类,继承自MarshalByRefObject
/// </summary>
public class PersonIDConverter : MarshalByRefObject
{
/// <summary>
/// 身份证ID 15转18位
/// </summary>
/// <param name="id">15位身份证号</param>
/// <returns>18位身份证号</returns>
public string PersonID15To18(string id)
{
int iS = 0;
int[] iW = new int[] { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };//加权因子常数
string LastCode = "10X98765432";//校验码常数
string newId;//新身份证号
newId = id.Substring(0, 6);
newId += "19";//填在第6位及第7位上填上‘1’,‘9’两个数字
newId += id.Substring(6, 9);
//进行加权求和
for (int i = 0; i < 17; i++)
{
iS += int.Parse(newId.Substring(i, 1)) * iW[i];
}
int iY = iS % 11; //取模运算,得到模值
newId += LastCode.Substring(iY, 1);//从LastCode中取得以模为索引号的值,加到身份证的最后一位,即为新身份证号。
return newId;
}
}

这里面提供了一个身份证15位转18位的服务。

运行时先启动RemotingServer项目,然后运行RemotingClient项目。

服务端运行后:

客户端运行后:

可以看到15位身份证号成功转为了18位,Remoting调用成功。

.NET Remoting的更多相关文章

  1. spring remoting源码分析--Hessian分析

    1. Caucho 1.1 概况 spring-remoting代码的情况如下: 本节近分析caucho模块. 1.2 分类 其中以hession为例,Hessian远程服务调用过程: Hessian ...

  2. Visual Studio 2013 Ultimate因为CodeLens功能导致Microsoft.Alm.Shared.Remoting.RemoteContainer.dll高CPU占用率的折中解决方案

    1.为什么Microsoft.Alm.Shared.Remoting.RemoteContainer.dll的CPU占用率以及内存使用率会那么高? 在Visual Studio 2013 Ultima ...

  3. VS2015 出现 .NETSystem.Runtime.Remoting.RemotingException: TCP 错误

    错误内容: 界面显示内容为: .NET�������������System.Runtime.Remoting.RemotingException: TCP 淇¢亾鍗忚鍐茬獊: 搴斾负鎶ュご銆� 鍦 ...

  4. .Net中Remoting通信机制简单实例

    .Net中Remoting通信机制 前言: 本程序例子实现一个简单的Remoting通信案例 本程序采用语言:c# 编译工具:vs2013工程文件 编译环境:.net 4.0 程序模块: Test测试 ...

  5. .Net中Remoting通信机制

    Remoting通信机制 Remoting介绍 主要元素 通道类型 激活方式 对象定义 Remoting介绍 什么是Remoting,简而言之,我们可以将其看作是一种分布式处理方式. 从微软的产品角度 ...

  6. .NET Remoting 应用实例

    前言 项目中运用到.NET Remoting ,前段时间也看了下.NET Remoting的相关资料,感觉自己应该动手写个实例来梳理下对.NET Remoting认识和理解,不足的地方请大家指正. 简 ...

  7. Holographic Remoting

    看到微软官方的 Holographic Remoting Player https://developer.microsoft.com/en-us/windows/holographic/hologr ...

  8. IIS部署Remoting总结

    1.在IIS里新建一个网站,命名为test,路径指向 e:\test: 2.在 e:\test下创建目录bin: 3.把Remoting远程对象的Project设置为类库,编译为DLL文件,然后复制到 ...

  9. .NET Remoting 体系结构 之 在 ASP.NET 中驻留远程服务器

    迄今为止,所有服务器示例都是运行在自驻留(self-hosted)的.NET 服务器上.自驻留的服务器必 须手动启动..NET Remoting 服务器也可以在许多其他的应用程序类型中启动.在 Win ...

  10. Remoting and web services using Spring[摘自官网]

    spring document url: http://docs.spring.io/spring/docs/ Using Hessian First we’ll have to create a n ...

随机推荐

  1. Chp4: Trees and Graphs

    1.Type of Tree 1. Binary Tree: a binary tree is a tree in which each node has at most two child node ...

  2. hdu 1242 Rescue(BFS,优先队列,基础)

    题目 /******************以下思路来自百度菜鸟的程序人生*********************/ bfs即可,可能有多个’r’,而’a’只有一个,从’a’开始搜,找到的第一个’r ...

  3. spring autoWire注解和@resource注解区别

    1.autoWire注解主要是按类型匹配.因为autowire的扫描机制,是按照接口类型来扫描bean的. 而JSR250 @resource注解是通过名称扫描注入的. @autowire注解的扫描方 ...

  4. dubbo/dubbox部署资料收集

    dubbo/dubbox部署资料收集 最近由于项目需要要部署bubbox,dubbo,在找资料过程中用的的一些网址如下,后来由于取消没有实际应用,以备今后再用 http://dubbo.io/Admi ...

  5. Intellij IDEA创建javaWeb以及Servlet简单实现

    1.创建web工程 File --> New --> Project...

  6. 利用qt打开一张图片并转成灰度矩阵

    首先是mat类,这个类的主要作用是构造一个容器,并将对应像素的灰度值放在容器内 #ifndef MAT_H #define MAT_H #include <vector> #include ...

  7. C# 使用AutoResetEvent进行线程同步

    AutoResetEvent 允许线程通过发信号互相通信. 通常,当线程需要独占访问资源时使用该类. 线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号. 如果 AutoRe ...

  8. mysql字符串区分大小写的问题

    一.1. CREATE TABLE NAME(name VARCHAR(10)); 对这个表,缺省情况下,下面两个查询的结果是一样的: SELECT * FROM TABLE NAME WHERE n ...

  9. maven 仓库下载缓慢,怎么解决

    maven下载jar的时候会去寻国外的地址,因此造成了下载jar很缓慢,影响开发效率,于是就出现maven镜像地址,可以使我们开发人员迅速下载相关的jar. 在maven的config的setting ...

  10. C Socket Programming for Linux with a Server and Client Example Code

    Typically two processes communicate with each other on a single system through one of the following ...