初识用.NET Remoting来开发分布式应用
一..NET Remoting简介:
.NET Remoting从某种意义上讲是DCOM的替代品。ASP.NET Web服务十分有用,但是这项技术在企业内联网的解决方案中,对于某些业务请求来说并不快,也没有足够的灵活性,而且,ASP.NET Web服务需要有运行时的支持。使用.NET Remoting技术后,可以将Web服务提供给世界上的任何地方。而且可以在所有的应用程序类型中运行Web服务。
二..NET Remoting 的基本原理:
体系结构图如下:
三.几个重要的概念:
1.远程对象:
远程对象类是从MarshalByRefObject类中派生的。跨越应用程序域调用这个类需要使用代理。.NET Remoting支持两种类型的远程对象:知名的(Well-known)远程对象和客户激活(Client-activated)远程对象。远程对象其实包括两层含义:
操作远程对象:对象运行在远程,客户段向他发送消息;
传递远程对象:将远程对象拿到本地,或者将本地对象发送过去,对副本进行操作。
2.激活:
使用new运算符可以激活远程对象。还有其它一些方式也可以激活远程对象,在以后的随笔里面我会介绍。
3.通道:
一个远程对象使用通道发送和接收消息。服务器选择一个通道来监听请求,客户端选择通道来和服务器通讯。Remoting提供了内置的通道:TCP通道和HTTP通道,我们也可以编写自己的通道。
4.编组:
数组通过应用程序域被传递的过程称为编组。将变量作为远程对象的参数来发送时,这个变量必须被转换,以便能够通过应用程序域发送该变量。
5.监听:
使用监听,能够将某些功能置入到方法调用链中。如果调用某个对象的方法,监听层便能够捕获调用来转换方法调用,或是完成某些日志记录。.NET Remoting调用链的每一部分都是用监听。
四.开发Remoting三步走:
开发.NET Remoting分三步走,在这里以一个简单的例子来说明。
1.创建远程对象:
继承System.MarshalByRefObject
using System;
using System.Collections;
using System.Text; namespace SimpleRemoting
{
public class HelloServer : MarshalByRefObject
{
public HelloServer()
{
///输出信息,服务器激活
Console.WriteLine("服务器激活……");
}
public String HelloMethod(String name)
{
Console.WriteLine(
"服务器端 : {0}", name);
return "这里是:" + name;
}
}
}
2.创建宿主应用程序:
注册通道
注册服务器激活的远程对象
运行宿主程序
using System;
using System.Net;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Remoting.Channels.Http; namespace SimpleRemoting
{ public class Server
{
public static int Main(string [] args)
{ ///创建Tcp通道
TcpChannel chan1 = new TcpChannel(); ///创建Http通道
HttpChannel chan2 = new HttpChannel(); ///注册通道
ChannelServices.RegisterChannel(chan1);
ChannelServices.RegisterChannel(chan2); RemotingConfiguration.RegisterWellKnownServiceType
(
typeof(HelloServer),
"SayHello",
WellKnownObjectMode.Singleton
); System.Console.WriteLine("按任意键退出!");
///下面这行不能少
System.Console.ReadLine();
return ;
} }
}
3.建立客户端程序:
注册通道
根据URL得到对象代理
使用代理调用远程对象
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Remoting.Channels.Http;
using System.IO; namespace SimpleRemoting
{
public class Client
{
public static void Main(string[] args)
{
///使用TCP通道得到远程对象
TcpChannel chan1 = new TcpChannel();
ChannelServices.RegisterChannel(chan1); HelloServer obj1 = (HelloServer)Activator.GetObject(
typeof(SimpleRemoting.HelloServer),
"tcp://localhost:8085/SayHello"); if (obj1 == null)
{
System.Console.WriteLine(
"连接TCP服务器失败");
} ///使用HTTP通道得到远程对象
HttpChannel chan2 = new HttpChannel();
ChannelServices.RegisterChannel(chan2); HelloServer obj2 = (HelloServer)Activator.GetObject(
typeof(SimpleRemoting.HelloServer),
"http://localhost:8086/SayHello"); if (obj2 == null)
{
System.Console.WriteLine(
"连接HTTP服务器失败");
} ///输出信息
Console.WriteLine(
"ClientTCP HelloMethod {0}",
obj1.HelloMethod("Caveman1"));
Console.WriteLine(
"ClientHTTP HelloMethod {0}",
obj2.HelloMethod("Caveman2"));
Console.ReadLine();
}
}
}
结束语:初识用.NET Remoting来开发分布式应用就到这里了,有时间我会就.NET Remoting技术写成系列文章。包括基于租约的生存期,编组,异步远程调用等等。
出处:http://www.cnblogs.com/Terrylee/archive/2005/11/03/267621.html
初识用.NET Remoting来开发分布式应用的更多相关文章
- 跟我一起学WCF(2)——利用.NET Remoting技术开发分布式应用
一.引言 上一篇博文分享了消息队列(MSMQ)技术来实现分布式应用,在这篇博文继续分享下.NET平台下另一种分布式技术——.NET Remoting. 二..NET Remoting 介绍 2.1 . ...
- 使用.NET Remoting开发分布式应用——基于租约的生存期
一.概述 知名类型的SingleCall对象可以在客户程序的方法调用之后被垃圾收集器清理掉,因为它没有保持状态,属于无状态的.而客户激活的类型的对象和知名类型的SingleTon对象都属于生存期长的对 ...
- 跟我一起学WCF(3)——利用Web Services开发分布式应用
一.引言 在前面文章中分别介绍了MSMQ和.NET Remoting技术,今天继续分享.NET 平台下另一种分布式技术——Web Services 二.Web Services 详细介绍 2.1 We ...
- 利用Web Services开发分布式应用
一.引言 在前面文章中分别介绍了MSMQ和.NET Remoting技术,今天继续分享.NET 平台下另一种分布式技术——Web Services 二.Web Services 详细介绍 2.1 We ...
- 回顾.NET Remoting分布式开发
记得在下第一次接触.NET Remoting分布式开发是在2003年,那时候是Framework1.0初次亮相之时,Remoting分布式开发是Framework1.0其中一个亮点.经过多年的发展,在 ...
- 使用.NET Remoting开发分布式应用——配置文件篇
我们已经知道可以通过编码的方式配置服务器通道和远程客户机,除此之外,还可以使用配置文件对服务器通道和远程客户机进行配置.使用远程客户机和服务器对象的配置文件的优点在于,用户无需修改任何一行代码,也无需 ...
- 使用NServiceBus开发分布式应用
系列主题:基于消息的软件架构模型演变 NServiceBus 是一个.Net平台下开源的消息服务框架,这类产品有时也被称作ESB(Enterprise Service Bus)--企业服务总线.NSe ...
- 装饰器的初识,基于bootstrap的前端开发
1装饰器的初识 概念:不改变函数原来的调用方式,动态地给函数添加功能 开放封闭的原则:1>对添加的新功能是开放的,32>不要在元代码进行修改(封闭) 1.1>函数的定义:对代码块和功 ...
- 初识linux端c++程序开发
关于linux端程序开发,我以前一直不知道是做些什么,只是感觉听高端的.最近接触了一些,有了一些初步的认识. 首先,linux是一个操作系统,跟windows一样:接通电源.按下电脑开机,电脑就会自动 ...
随机推荐
- 20165114 《网络对抗技术》 Exp0 Kali安装与配置 Week1
目录: 一.kail的下载与安装 二.kali的网络设置 三.安装vmware-tools. 四.更新软件源. 五.共享文件夹 六.安装中文输入法 一.kail的下载与安装 VMware workst ...
- 详解Linux系统中的文件名和文件种类以及文件权限
Linux文件种类与副文件名 一直强调一个概念,那就是:任何装置在Linux底下都是文件, 不仅如此,连资料沟通的介面也有专属的文件在负责-所以,你会瞭解到,Linux的文件种类真的很多- 除了前面提 ...
- 解决Spark用Maven编译时报Exception in thread "main" java.lang.OutOfMemoryError: PermGen space异常
异常截图: 解决方法: export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m"
- IE6+以上清除浮动普遍方法总结
浮动,CSSfloat属性.学过的人应该知道这个属性,平时用的应该也是很多的.特别是在N栏布局中. 但是我们会经常遇到这样一种情况,前面的元素浮动之后会影响后面的元素,后面的元素需要用清除浮动来消灭前 ...
- Merge k Sorted Lists, k路归并
import java.util.Arrays; import java.util.List; import java.util.PriorityQueue; /* class ListNode { ...
- oracle 子查询详解 in和exists的区别
sql允许多层嵌套,子查询是嵌套在其他查询中的查询.我们可以把子查询当做一张表来看到,即外层语句可以把内嵌的查询结果当做一张表使用. 子查询查询结果有三种情况 不返回查询记录.若子查询不返回记录则主查 ...
- github上十二款最著名的Android播放器开源项目
1.ijkplayer 项目地址: https://github.com/Bilibili/ijkplayer 介绍:Ijkplayer 是Bilibili发布的基于 FFplay 的轻量级 Andr ...
- BusyIndicator using MVVM 忙碌状态指示器的的实现
ViewModel 视图模型 public abstract class ViewModelBase : INotifyPropertyChanged { private bool isbusy; p ...
- CSS自定义字体(@font-face选择符)
@font-face是CSS中的一个模块,他主要是把自己定义的Web字体嵌入到你的网页中,随着@font-face模块的出现,我们在Web的开发中使用字体不怕只能使用Web安全字体. 语法规则: @f ...
- 禁用Browser Link
Browser Link是VS 2013开始引入的一个强大功能,让前端代码(比如AngularJS的代码)在VS中的修改更加轻而易举. 前端代码是运行在浏览器中,而Visual Studio通常只会和 ...