Remoting 的“传递的引用”理解
WCf是集大成者,具有其他微软的很多技术,其中分布式上很多借助于Remoting,所以研究一下Remoting有助于理解WCF
提到Remoting就不得不涉及到MarshalByRefObject这个对象,网络上对这个词语的解释非常的模糊不清,特别是说“跨域访问,Remoting是引用传递,不是值传递”,而没有讲“引用传递”到底是传的什么东西,有的地方确实说了通过ObjRef对象 传递需要交互的所有内容信息,但是更多的是对“引用传递”没有清楚的认识,或者说是通过其他方式来理解“引用传递”而不是通过“引用传递”来更好的理解Remoting,这种逻辑思维方式,特别容易产生囫囵吞枣的模糊概念,看似明白,其实不明白。
为了理解引用传递,写了一个例子,可能有助于理解 代码
定义Interface
public interface IPersonService
{
String HelloMethod(String name);
}
定义 Implement
public class PersonService : MarshalByRefObject, IPersonService
{
public String HelloMethod(String name)
{
Console.WriteLine(
"Server Hello.HelloMethod : {0}", name);
return "Hi there " + name;
}
}
定义Service
static void Main(string[] args)
{
//TCP协议传输消息的信道实现
TcpChannel chan1 = new TcpChannel(8085);
//为远程调用实现使用HTTP协议传输消息的客户端通道
HttpChannel chan2 = new HttpChannel(8086);
//提供帮助进行远程处理信道注册、解析和URL发现的静态方法。无法继承此类
ChannelServices.RegisterChannel(chan1, false);
ChannelServices.RegisterChannel(chan2, false);
//提供多种配置远程结构的静态方法
RemotingConfiguration.RegisterWellKnownServiceType
(
//typeof(HelloServer),
typeof(PersonService),
"SayHello",
WellKnownObjectMode.Singleton
); System.Console.WriteLine("Press Enter key to exit");
System.Console.ReadLine();
}
定义Client
class Program
{
static void Main(string[] args)
{
TcpChannel chan1 = new TcpChannel();
ChannelServices.RegisterChannel(chan1,false);
//Activator包含特定的方法,用以在本地或从远程创建对象类型、或获取对现有远程对象的引用。无法继承此类
IPersonService obj1 = (IPersonService)Activator.GetObject(
typeof(IPersonService),// typeof(HelloServer),
"tcp://localhost:8085/SayHello");
if (obj1 == null)
{
System.Console.WriteLine(
"Could not locate TCP server");
}
//使用HTTP通道得到远程对象
HttpChannel chan2 = new HttpChannel();
ChannelServices.RegisterChannel(chan2,false);
IPersonService obj2 = (IPersonService)Activator.GetObject(
typeof(IPersonService),// typeof(HelloServer),
"http://localhost:8086/SayHello");
if (obj2 == null)
{
System.Console.WriteLine(
"Could not locate HTTP server");
} Console.WriteLine(
"Client1 TCP HelloMethod {0}",
obj1.HelloMethod("Caveman1"));
Console.WriteLine(
"Client2 HTTP HelloMethod {0}",
obj2.HelloMethod("Caveman2"));
Console.ReadLine();
}
}
注意,客户端使用的 “IPersonService”接口,对于客户端来讲是不知道接口的实例类的,
客户端方法的调用也只是通过Activator生成的代理对象把调用的信息、链接信息等等进行打包,
服务端接收到打包过来的信息后,根据打包信息内容,对相应的类和方法进行操作,比如:创建(调用)服务实体,对方法进行调用,把返回值进行打包并传输给客户端端,里边具体的逻辑还需要继续研究
这里只想说明一点,“Remoting传输的引用”,到底是什么意思,免得误解。
Remoting 的“传递的引用”理解的更多相关文章
- 理解java值传递与引用传递
1.基本类型和引用类型在内存中的保存 Java中数据类型分为两大类,基本类型和对象类型.相应的,变量也有两种类型:基本类型和引用类型.基本类型的变量保存原始值,即它代表的值就是数值本身:而引用类型的变 ...
- 堆栈详解 + 彻底理解Java的值传递和引用传递
本文旨在用最通俗的语言讲述最枯燥的基本知识 学过Java基础的人都知道:值传递和引用传递是初次接触Java时的一个难点,有时候记得了语法却记不得怎么实际运用,有时候会的了运用却解释不出原理,而且坊间讨 ...
- JAVA不可变类与可变类、值传递与引用传递深入理解
一个由try...catch...finally引出的思考,在前面已经初步了解过不可变与可变.值传递与引用传递,在这里再次深入理解. 1.先看下面一个try..catch..finally的例子: P ...
- 深入理解python中函数传递参数是值传递还是引用传递
深入理解python中函数传递参数是值传递还是引用传递 目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用.Python参数传递采用的肯定是"传对象引用 ...
- 理解java中的值传递与“引用传递”
额....java中其实没有引用传递 对于引用类型 ,在调用方法后,直接拷贝了引用的副本,但是它们指向了相同的堆地址,所以看起来像引用传递,但其实是值传递,只不过传递的引用的副本. 说一说为什么Str ...
- Java中引用类型变量,对象,值类型,值传递,引用传递 区别与定义
一.Java中什么叫做引用类型变量?引用:就是按内存地址查询 比如:String s = new String();这个其实是在栈内存里分配一块内存空间为s,在堆内存里new了一个Stri ...
- java中值传递和引用传递
最近工作中使用到了值传递和引用传递,但是有点懵,现在看了下面的文章后清晰多了.一下是文章(网摘) 1:按值传递是什么 指的是在方法调用时,传递的参数是按值的拷贝传递.示例如下: public clas ...
- Java中的值传递和引用传递
这几天一直再纠结这个问题,今天看了这篇文章有点思路了,这跟C++里函数参数为引用.指针还是有很大区别. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里 ...
- java的值传递和引用传递
昨天博主在对于值传递和引用传递这里栽了一个大坑啊,导致一下午时间都浪费在这里,我们先说下值传递和引用传递java官方解释: 值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对 ...
随机推荐
- Extjs嵌入html
方式一:使用组件的html属性嵌入html代码,如果html代码中存在参数可以使用字符串拼接的方式拼接html代码. html页面: <!doctype html> <html> ...
- HTML 内嵌JS脚本、相关参考手册
提供一个JS.HTML参考手册入口:http://www.w3school.com.cn/jsref/index.asp. JavaScript 最常用于图片操作.表单数据处理以及内容动态更新. &l ...
- 让乔布斯立足肩上的C语言之父
2011年,人们对乔布斯的去世记忆深刻,但这一年还有另一位本应获得同样关注的人物也与世长辞,他就是C语言之父丹尼斯·里奇(Dennis Ritchie). 不过,并非所有人都没能正确认识到里奇所曾作出 ...
- LINQ to SQL 建立实体类
使用LINQ to SQL时,需要首先建立用于映射数据库对象的模型,也就是实体类.在运行时,LINQ to SQL 根据LINQ表达式或查询运算符生成SQL语句,发送到数据库进行操作.数据库返回后,L ...
- What qualities characterize a great PhD student
省理工计算机教授David Karger接触了许多世界上最杰出的博士生,近日总结出了优秀博士通常具备的五点品质:0 过人的智力 1 好奇心 2 创造力 3 纪律性与生产力 4 与观众沟通 5 与伙伴沟 ...
- 转载:关于 Token,你应该知道的十件事
关于 Token,你应该知道的十件事 原文地址:http://alvinzhu.me/blog/2014/08/26/10-things-you-should-know-about-tokens/ 原 ...
- 【转】ListView与RadioButton组合——自定义单选列表
原文网址:http://blog.csdn.net/checkin001/article/details/11519131 Android自带的RadioButton单选框只支持添加文字,我们自己写A ...
- Ubuntu14.04 安装QQ国际版wine-qqintl
Ubuntu14.04安装qq国际版方式: 首先下载,链接为: https://pan.baidu.com/s/1boPitVD 密码:jp1j 也可去Ubuntu中文的Kylin(优麒麟)官网下载 ...
- 帕累托分析法(Pareto Analysis)(柏拉图分析)
帕累托分析法(Pareto Analysis)(柏拉图分析) ABC分类法是由意大利经济学家帕雷托首创的.1879年,帕累托研究个人收入的分布状态图是地,发现少数人收入占全部人口收入的大部分,而多数人 ...
- Ext tabpanel集成第三方charts(echarts、amcharts等)的问题(报getstyle为null的错误)
最近在做ext集成charts的功能,主要是使用tabpanel,将charts集成到tab中,随便切换tab选项就会报错崩溃. 之前演示的时候也发现了该问题,由于在tab项中有加载svg文件的操作, ...