首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 认证考试-> 软件水平考试
Remoting服务端和客户端程序该这样模式来写-.NET教程,评论及其它
作者:网友供稿 点击:72
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 
远程对象的激活模式分服务端激活和客户端激活两种,(也就是对象分服务端激活对象或者说是知名对象和客户端激活对象两种)先看看msdn怎么描述服务端激活的:

服务器激活的对象是其生存期由服务器直接控制的对象。服务器应用程序域只有在客户端在对象上进行方法调用时才创建这些对象,而不会在客户端调用 new 或 activator.getobject 时创建这些对象;这节省了仅为创建实例而进行的一次网络往返过程。客户端请求服务器激活的类型实例时,只在客户端应用程序域中创建一个代理。然而,这也意味着当您使用默认实现时,只允许对服务器激活的类型使用默认构造函数。若要发布其实例将使用带参数的特定构造函数创建的类型,可以使用客户端激活或者动态地发布您的特定实例。

服务器激活的对象有两种激活模式(或 wellknownobjectmode 值):singleton 和 singlecall。

singleton 类型任何时候都不会同时具有多个实例。如果存在实例,所有客户端请求都由该实例提供服务。如果不存在实例,服务器将创建一个实例,而所有后继的客户端请求都将由该实例来提供服务。由于 singleton 类型具有关联的默认生存期,即使任何时候都不会有一个以上的可用实例,客户端也不会总接收到对可远程处理的类的同一实例的引用。

singlecall 远程服务器类型总是为每个客户端请求设置一个实例。下一个方法调用将改由其他实例进行服务。从设计角度看,singlecall 类型提供的功能非常简单。这种机制不提供状态管理,如果您需要状态管理,这将是一个不利之处;如果您不需要,这种机制将非常理想。也许您只关心负载平衡和可伸缩性而不关心状态,那么在这种情况下,这种模式将是您理想的选择,因为对于每个请求都只有一个实例。如果愿意,开发人员可以向 singlecall 对象提供自己的状态管理,但这种状态数据不会驻留在对象中,因为每次调用新的方法时都将实例化一个新的对象标识。

首先对于服务端激活的两种模式来做一个试验,我们把远程对象做如下的修改:

using system;

namespace remoteobject
{
    
public class myobject:marshalbyrefobject
    {
        
private int i=0;
        
public int add(int a,int b)
        {
            
return a+b;
        }

        
public int count()
        {
            
return ++i;
        }
    }
}

对客户端做以下修改:
remoteobject.myobject app = (remoteobject.myobject)activator.getobject(typeof(remoteobject.myobject),system.configuration.configurationsettings.appsettings["serviceurl"]);
            console.writeline(app.count());
            console.readline();

第一次打开客户端的时候显示1,第二次打开的时候显示2,类推……由此验证了singleton 类型任何时候都不会同时具有多个实例。如果存在实例,所有客户端请求都由该实例提供服务。如果不存在实例,服务器将创建一个实例,而所有后继的客户端请求都将由该实例来提供服务。

把服务器端的config修改一下:
<wellknown type="remoteobject.myobject,remoteobject" objecturi="remoteobject.myobject"
                    mode
="singlecall" />

(这里注意大小写,大写的c)
再重新运行服务端和客户端,打开多个客户端发现始终显示1。由此验证了singlecall 类型对于每个客户端请求都会重新创建实例。下一个方法调用将由另一个服务器实例提供服务。

下面再说一下客户端的激活模式,msdn中这么写:

客户端激活的对象是其生存期由调用应用程序域控制的对象,正如对象对于客户端是本地对象时对象的生存期由调用应用程序域控制一样。对于客户端激活,当客户端试图创建服务器对象的实例时发生一个到服务器的往返过程,而客户端代理是使用对象引用 (objref) 创建的,该对象引用是从在服务器上创建远程对象返回时获取的。每当客户端创建客户端激活的类型的实例时,该实例都将只服务于该特定客户端中的特定引用,直到其租约到期并回收其内存为止。如果调用应用程序域创建两个远程类型的新实例,每个客户端引用都将只调用从其中返回引用的服务器应用程序域中的特定实例。

理解一下,可以归纳出
1、客户端激活的时间是在客户端请求的时候,而服务端激活远程对象的时间是在调用对象方法的时候

远程对象修改如下:
using system;

namespace remoteobject
{
    
public class myobject:marshalbyrefobject
    {
        
private int i=0;

        
public myobject()
        {
            console.writeline(
"激活");
        }

        
public int add(int a,int b)
        {
            
return a+b;
        }

        
public int count()
        {
            
return ++i;
        }
    }
}

服务端配置文件:
<configuration>
    
<system.runtime.remoting>
        
<application name="remoteserver">
            
<service>
                
<activated type="remoteobject.myobject,remoteobject"/>
            
</service>
            
<channels>
                
<channel ref="tcp" port="9999"/>
            
</channels>
        
</application>
    
</system.runtime.remoting>
</configuration>

客户端程序:
using system;

namespace remoteclient
{
    
class myclient
    {
        [stathread]
        
static void main(string[] args)
        {
            
//remoteobject.myobject app = (remoteobject.myobject)activator.getobject(typeof(remoteobject.myobject),system.configuration.configurationsettings.appsettings["serviceurl"]);
            remoteobject.myobject app=(remoteobject.myobject)activator.createinstance(typeof(remoteobject.myobject),null,new object[]{new system.runtime.remoting.activation.urlattribute(system.configuration.configurationsettings.appsettings["serviceurl"])});
            
//console.writeline(app.count());
            console.readline();
        }
    }
}

客户端配置文件:
<configuration>
 
<appsettings>
 
<add key="serviceurl" value="tcp://localhost:9999/remoteserver"/>
 
</appsettings>
</configuration>

(这里的uri按照服务端配置文件中application元素定义的remoteserver来写)

运行程序可以看到,在客户端启动的时候服务端就输出了“激活”,我们再转回知名模式进行测试发现只有运行了方法才会在服务端输出“激活”。

2、客户端激活可以调用自定义的构造方法,而不像服务端激活只能使用默认的构造方法

把客户端代码修改如下:
remoteobject.myobject app=(remoteobject.myobject)activator.createinstance(typeof(remoteobject.myobject),new object[]{10},new object[]{new system.runtime.remoting.activation.urlattribute(system.configuration.configurationsettings.appsettings["serviceurl"])});
            console.writeline(app.count());

这里看到我们在createinstance方法的第二个参数中提供了10作为构造方法的参数。在服务端激活模式我们不能这么做。

远程对象构造方法修改如下:

public myobject(int k)
        
{
            
this.i=k;
            console.writeline(
"激活");
        }

毫无疑问,我们运行客户端发现输出的是11而不是1了。

3、通过上面的例子,我们运行多个客户端发现出现的永远是11,因此,客户端激活模式一旦获得客户端的请求,将为每一个客户端都建立一个实例引用。

总结:
1、remoting支持两种远程对象:知名的和客户激活的。知名的远程对象使用了uri作为标识,客户程序使用这个uri来访问那些远程对象,也正式为什么称作知名的原因。对知名的对象来说2种使用模式:singlecall和singleton,对于前者每次调用都会新建对象,因此对象是无状态的。对于后者,对象只被创建一次,所有客户共享对象状态,因此对象是有状态的。另外一种客户端激活对象使用类的类型来激活,uri再后台被动态创建,并且返回给客户程序。客户激活对象是有状态的。
2、对于singleton对象来说需要考虑伸缩性,singleton对象不能在多个服务器上被部署,如果要跨服务器就不能使用singleton了。

备注:个人习惯原因,在我的例子中服务端的配置都是用config文件的,客户端的配置都是基本用程序方式的
使用配置文件的优点:无需重新编译就可以配置通道和远程对象,编写的代码量比较少
使用程序定制的优点:可以获得运行期间的信息,对程序调试有利。


文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·省市联动菜单的源代码实现(access数据库版)-ASP教程,数据库相关
·【HTML】打开页面时按照指定的URL直接跳转到另一新页面-ASP教程,脚本编码
·多功能DataGrid打印类(WinForm C#)-.NET教程,C#语言
·我也来谈WEB打印。-ASP教程,打印相关
·C#中的泛型 (From dotNet SDK 2.0 Beta1)-.NET教程,C#语言
·J2EE WEB层的曙光 -- JSF-JSP教程,J2EE/EJB/服务器
·C#:获得文件版本信息及只读文件的删除-.NET教程,C#语言
·[ASP.NET]按键跳转以及按Enter以不同参数提交,及其他感应事件-.NET教程,Asp.Net开发
·谈基于.net平台windows开发中的模式窗体-.NET教程,.NET Framework
·ASP.NET 2.0 中实现 Treeview 与数据库的绑定(含代码)-.NET教程,Asp.Net开发
最新文章
·中文版windows xp系统升级sp3新鲜体验_windows xp
·十个提高windows vista系统性能的秘密_windows vista
·用搏客blog月收入200美圆_网赚技巧
·google 禁止使用在线广告宣传adsense推介_网赚技巧
·做广告联盟的站长必读规则_网赚技巧
·刘润:用c2c模式运作捐献公益组织_站长访谈
·seo资料站长丘仕达访谈:整站优化心得_站长访谈
·易被忽视的优化网站设计的五种方法_站长心得
·photoshop非主流照片:可爱红脸蛋美女_photoshop教程
·如何让网民爱上你的网站?(1)_站长心得
相关主题
  • RemotingIIS承载方式-.NET教程,评论及其它
  • Remoting的承载方式是这样的-.NET教程,评论及其它
  • Remoting和Web服务的区别-.NET教程,Web Service开发
  • Remoting的事件机制(带具体例子)-.NET教程,评论及其它
  • Remoting事件机制续-.NET教程,评论及其它
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭