C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Samples\Technologies\Remoting这里有不少例子
解决方案 »
- C# listbox怎么没有滚动条
- 我该学习些什么?
- 100分询问使用DataContractJsonSerializer 反序列化复杂JSON时的问题
- 在主窗体中点击命令钮Command8将激发事件Command8_Click,请问:这时eventArgs变量中的哪个属性或方法代表其主窗体的当前实例this。请看代码:
- 请问如何在reportviewer中显示数据库中的图片?????
- 最大化的问题,请大虾帮忙!
- C#读串口扫描枪的程序
- DATAGRIDVIEW 排序后 还选择原来的行
- ///注释和/,/*有什么区别吗?
- 再问: 如何在水晶报表打印完成以后返回打印成功与否的值?
- C#程序的内存占用只能让我敬而远之了 :(
- 高分求InstallShield for .Net的书或者资料~ (各位对打包发布C#程序感到头疼的XDJM进来聊聊~)
所谓服务器端激活对象就是对象的实体是存在于服务器上,即对于任何客户端对服务器端组件的调用会在服务器创建调用的类的实体对象,而不会在客户机上创建这样一个实体(当然客户端是通过该队相对应的代理来和服务器的远程对象通信)。
和绕口令一样。呵呵。关于SingleCall和Singleton;
他们都属于服务器端激活,但是他们的区别还是非常大的;
主要的区别是:SingleCall他会为每个客户端调用产生一个对象实例,举个例子,假设有可远程调用的类test1,当我们在客户端使用
test1 uCall=(test1 )Activator.GetObject(typeof(test1),"XXXXX");得到对象实体以后我们就可以使用这个实体了,如同使用本地的.NET装配件一样。但是uCall的每一次调用得到的都不是同一个实体,如何理解呢?是这样的,假设这个类有属性property0和property1,方法有method0,method1;当你使用uCall.property0然后又使用uCall.property1这时候记住你现在访问了类test1的两个实体,虽然代码看上去只是一个uCall实体,其实不然,你可以自己试一下,即uCall.property0和uCall.property1这两个连续的调用访问的是不同的实体而不是同一个实体,这就应征了“SingleCall他会为每个客户端调用产生一个对象实例”这句话;当然Singleton我也就不用多说了,如果你需要维持状态的调用,即每个客户端调用访问的都是同一个实体的话就用他-Singleton
以上是个人的愚见,如果有误,还忘大家给与指正。
代理程序呀,不管是服务器端激活还是客户端激。
其实实际应用中可不可以不需要这个代理程序呀。因为如果要调用远程组件一定要启用
代理程序。这里不是很麻烦吗,等于在服务器上还要装上一个程序还要控制它。
实际上是不是这样的呀,应该可以像webserver一样可以远程激活吧.......?????????
我估计你理解错了,他所谓的中间代理程序可能就是指的客户端的代理,这个东西.NET会为你自动配置,当然,为了提高效率,你也可以自己用代码配置。
http://www.microsoft.com/china/msdn/library/dnhcvs03/html/vs03d1.asp此解决方案包含运行“Digits of Pi”应用程序所需的三个项目(Client、Server 和 ServerLoader)。
除了client程序和server组件外还有一个serverloader,要调用server组件先要运行serverloader程序才行。希望你能指点
如果能没有它程序remoting就会像是本地调用一样对吧
1.创建你的分布式应用的应用逻辑(也就是我们常说的业务逻辑层,当然你也可以直接理解为服务器提供给我们的可以使用的功能);在那个例子中就是Plouffe_Bellard.dll这个装配件,它里面封装了我们将来会使用的一些应用逻辑或者说是应用功能;所以说Plouffe_Bellard.dll是来完成这个第一步工作的。
2.在服务器端创建传输远程调用消息的通道,也就是打开一个指定的通道,并在服务器上注册这个通信信道,这个通道被用来完成服务器端对象和客户端对象的通信工作,当然通道可以有多种注册方式,简单的我现在举一个注册TCP通道的例子:
int REMOTE_PORT=9002;
TcpServerChannel channel=new TcpServerChannel(REMOTE_PORT);
ChannelServices.RegisterChannel(channel);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(您要使用的可远程调用的组件,如TestClass.ClsTest),Your URI,WellKnownObjectMode.SingleCall或是Singleton);
//方法RegisterWellKnownServiceType中各参数的含义大家可以查MSDN了解,我这里就不多说了。
只有完成了这个步骤你这个服务器才会真正提供这个可远程调用的组件,也就是相当于在服务器上发布了这个Web Service,可以理解吧!
在ivt(零下一度(.net版)) 所说的那个例子里面DigitsOfPi.exe肯定就是做第二步这个工作的。
3.好了,有了以上两步,那我们在客户端就可以使用这个可远程调用的组件了,那么怎么使用它呢?当然不能和使用本地的装配件一样采取添加引用->实例化这种途径了,首先,要明白你现在要使用的不是本地一个装配件中某个类的实例,我们要使用远程主机上某个装配件中某个类的实例,所以必须从远程主机上获取对象,要从远程主机上获取对象就要在客户机上创建通信信道,以便使我们能够从这个信道得到远程主机上对象的状况及他的实例,我们的客户端不需要直接和服务器打交道获得远程对象,我们是通过存在与客户端的代理来实现对远程对象的访问的。这中间有一系列复杂得操作过程,但好的是微软已经替我们做好了,我们不需要关心其中的细节。当然,如果有需要您也可以自己用代码来完成这些细节。(我就不一一介绍了,有兴趣自己看MSDN)到这里您一定会问,什么是客户端的代理?如何使用客户端代理访问远程对象?客户端代理帮助我们完成与服务器通信(其实也不是客户端代理直接于服务器通信,中间还有若干步骤,不过我们可以视而不见:))来得到服务器的远程对象;使用客户代理获得远程对象可创建客户端代理在代码中是一句话如下:
//为了对应我上面的服务器端程序我在客户端同样注册了TCP信道
ChannelServices.RegisterChannel(new TcpClientChannel());
XXX.XXX xxx=(XXX.XXX)Activator.GetObject(typeof(XXX.XXX), "tcp://ServerName":PortNum/URI");
这时候xxx就是您需要得服务器的远程对象;
而Activator.GetObject(typeof(XXX.XXX), "tcp://ServerName":PortNum/URI");就是客户端代理的创建;
好了这就是一个很简单但是很完整的.NET Remoting的模型了,在ivt(零下一度(.net版))所说的那个例子中,完成这部分功能得应该是ServerLoader.exe;
现在应该很明白了吧!!
也就是说客户端一定要有代理才能得到远程对象的实例,否则是无法进行远程调用的通信的而这个代理其实你也可以理解为客户端去得到(请求)一个远程对象的实例的动作。