.Net Remoting基础(二)

  • 客户端
    客户端主要做两件事,一是注册通道。Remoting中服务器端和客户端都必须通过通道来传递消息,以获得远程对象。第二步则是获得该远程对象。
1) 注册通道

TcpChannel channel = new TcpChannel();
channelServices.RegisterChannel(channel);
注意在客户端实例化通道时,是调用的默认构造函数,即没有传递端口号。事实上,这个端口号是缺一不可的,只不过它的指定被放在后面作为了Uri的一部分。

2) 获得远程对象
与服务器端相同,不同的激活模式准定了客户端的实现方式也将不同。不过这个区别仅仅是WellKnow激活模式和客户端激活模式之间的区别,而对于SingleTon和SingleCall模式,客户端的实现完全相同。

(1)WellKnown激活模式
要获得服务器端的知名远程对象,可通过Activator进程的GetObject()方法来获得
ServerRemoteObject.ServerObject serverObj = (ServerRemoteObject.ServerObject)Activator.GetObject(typeof(ServerRemoteObject.ServerObject),"tcp://localhost:8080/ServiceMessage");
首先以WellKnow模式激活,客户端获得对象的方法是使用GetObject()。其中参数第一个是远程对象的类型。第二个参数就是服务器端的uri。如果是http通道,自然是用http://localhost:8080/ServiceMessage了。因为我是用本地机,所以这里是localhost,你可以用具体的服务器IP地址来代替它。端口必段和服务器端的端口一致。后面则是服务器定义的远程对象服务名,即ApplicationName属性的内容。

(2)客户端激活模式
如前所述,WellKnow模式在客户端创建对象时,只能调用默认的构造函数,GetObject()方法不能传递构造函数的参数。而客户端激活模式则可以通过自定义的构造函数来创建远程对象。
客户端激活模式有两种方式:
a. 调用RemotingConfiguration的静态方法RegisterActivatedClientType()。这个方法返回值为void,它只是将远程对象注册在客户端而已。具体的实例还需要调用对象类的构造函数。
RemotingConfiguration.RegisterActivatedClientType(typeof(ServerRemoteObject.ServerObject),"tcp://localhost:8080/ServiceMessage");
ServerRemoteObject.ServerObject serverObj = new ServerRemoteObject.ServerObject();

b. 调用进程Activator的CreateInstance()方法。这个方法将创建方法参数指定类型的类对象。它与前面的GetObject()不同的是,它要在客户端调用构造函数,而GetObject()只是获得对象,而创建实例是在服务端完成的。CreateInstance()方法有很多个重载。如下:
public static object CreateInstance(Type type,object[] args,object[] activationAttributes);
参数说明:
type:要创建的对象的类型。
args:与要调用构造函数的参数数量、顺序和类型匹配的参数数组。如果args为空数组或空引用,则调用不带任何参数的构造函数(默认构造函数)。
activationAttributes:包含一个或多个可以参与激活的属性的数组。

这里的参数args是一个object[]数组类型。它可以传递要创建对象的构造函数中的参数。从这里其实可以得到一个结论:WellKnow激活模式所传递的远程对象类,只能使用默认的构造函数;而Activated模式则可以用户自定义构造函数。activaltionAttributes参数在这个方法中通常用来传递服务器的url。
ServerObject(string pName,string pSex,int pAge)
{
name = pName;
sex = pSex;
age = pAge;
}

object[] attrs = {new UrlAttribute("tcp://localhost:8080/ServiceMessage")};
object[] objs = new object[3];
objs[0] = "wayfarer";
objs[1] = "male";
objs[2] = 28;
ServerRemoteObject.ServerObject = Activator.CreateInstance(typeof(ServerRemoteObject.ServerObject),objs,attrs);


public static ObjectHandle CreateInstance(string assemblyName,string typeName,object[] activationAttribute);
参数说明:
assemblyName:将在其中查找名为typeName的类型的程序集的名称。如果assemblyName为空引用,则搜索正在执行的程序集。
typeName:首选类型的名称。
activationAttributes:包含一个或多个可以参与激活的属性的数组。
object[] attrs = {new UrlAttribute("tcp://localhost:8080/EchoMessage")};
ObjectHandle handle = Activator.CreateInstance("ServerRemoteObject","ServerRemoteObject.ServerObject",attrs);
ServerRemoteObject.ServerObject obj = (ServerRemoteObject.ServerObject)handle.Unwrap();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值