Net Remoting 与 Server 区别

2024-02-15 12:08
文章标签 区别 net server remoting

本文主要是介绍Net Remoting 与 Server 区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Net Remoting 与 Server 对象详解
摘要
本文介绍了Net Remoting的几个简单概念,并尝试从最简单的角度帮您理解什么是Remoting。同时,本文包括了一个使用Http Channel调用Remoting服务器的例子,并讨论了不同的Server对象的差别以及对象的生命周期.
通过本篇文章的阅读,用户可以对Remoting的基本概念有了解,并知道几种Server端对象的区别和Server对象生命周期的概念。

目录
  • Remoting简介
  • Remoting的一个典型示例
  • 三种不同的Remoting Server对象类型
  • Remoting和Web Service区别

Remoting简介
相信很多人都在不同的地方看到Remoting这个名词,其实它的概念很简单。我们通过使用Remoting来进行不同应用程序之间的通信,不管这些程序是在同一台计算机上,还是在局域网内的不同计算机上,甚至在Internet的不同操作系统上(当然相应的操作系统也必须实现了.Net Framework)。Remoting的两大功能在于:
1)不同进程间的通信。
2)不同应用域(AppDomain),不同进程的对象之间的通信(可以使用多种通信协议)。
.NET Remoting框架
为了使用Remoting, .NET提供了一整套框架来使这种分布的调用透明化。它的框架如下图所示:
图1:.NET Remoting构架图
通常用到的Remoting的概念有:
Remoting Channel:这是指客户端和服务器端的通信协议,如我们可以使用TCP, HTTP协议。
Serializer:这是指在传输时采用何种格式来传输数据,如我们可以采用Binary,也可以采用SOAP来传输XML格式的数据.
.NET力图简化这些概念的编程,所以上面所述的协议和格式都可以通过更改配置文件切换。这也是编程人员不用担心的问题。如一段典型的客户端配置文件的内容是:
<configuration>
<system.runtime.remoting>
<application>
<channels>
<channel ref="http" clientConnectionLimit="200">
<clientProviders>                                   
<formatter ref="binary"/>                                 
</clientProviders>   
</channel>           
</channels>
</application>
</system.runtime.remoting>
</configuration>

Remoting的一个典型示例
让我们首先来看一个典型的实例。我们会有一个服务器程序Server.exe和一个客户端程序CAOClient.exe。客户端程序会通过http channel调用服务器端RemoteType.dll的对象和方法。我们会来检查在几种不同的Server对象下,这些调用会有什么样不同的结果。
服务器端代码
Server.cs
using System;
using System.Runtime.Remoting;
public class Server{
public static void Main(string[] Args){
// Load the configuration file
RemotingConfiguration.Configure("server.exe.config");
Console.WriteLine("The server is listening. Press Enter to exit....");
Console.ReadLine();   
Console.WriteLine("GC'ing.");
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
表1:Server.cs源代码
Server.exe.config
<configuration>
<system.runtime.remoting>
<application>
<service>
<activated type="ClientActivatedType, RemoteType"/>
</service>
<channels>
<channel port="8088" ref="http"/>
</channels>
</application>
</system.runtime.remoting>
</configuration>
表2:Server.exe.config源代码
RemoteType.cs
using System;
using System.Runtime.Remoting.Lifetime;
using System.Security.Principal;
public class ClientActivatedType : MarshalByRefObject{
private int i;
// override the lease settings for this object
public override Object InitializeLifetimeService(){
return null;
}
public string RemoteMethod(){
// announce to the server that we've been called.
Console.WriteLine("ClientActivatedType.RemoteMethod called.");
// report our client identity name
i=this.GetHashCode();	
return "RemoteMethod called. " + i;
}
public string RemoteMethod1(){
return "RemoteMethod1 called. " + i;
}
}
表3:RemoteType.cs源代码
客户端代码
CAOClient.cs
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Lifetime;
public class Client{
public static void Main(string[] Args){
// Load the configuration file
RemotingConfiguration.Configure("CAOclient.exe.config");   
ClientActivatedType CAObject = new ClientActivatedType();
Console.WriteLine("Client-activated object: " + CAObject.RemoteMethod());
Console.WriteLine("Client-activated object: " + CAObject.RemoteMethod1());
Console.WriteLine("Press Enter to end the client application domain.");
Console.ReadLine();
}
}
表4 CAOClient.cs源代码
CAOClient.exe.config
<configuration>
<system.runtime.remoting>
<application>
<client url="http://localhost:8088">
<activated type="ClientActivatedType, RemoteType"/>
</client>
<channels>
<channel ref="http" port="0"/>
</channels>
</application>
</system.runtime.remoting>
</configuration>
表5:CAOClient.exe.config源代码
编译文件
使用“Visual Studio .NET Command Prompt="分别编译上述文件:
csc /target:library RemoteType.cs
csc Server.cs
csc –reference:RemoteType.dll CAOClient.cs
您会看到三个输出文件:RemoteType.dll, Server.exe 和 CAOClient.exe。
运行Remoting程序
在命令行方式下启动:Server.exe
在命令行方式下启动:CAOClient.exe
程序分析
这是一个非常简单的Remoting程序,如果去掉两个配置文件(Server.exe.config和CAOClient.exe.config),你简直看不到它和非Remoting的程序有什么差别。实际上,在两个配置文件中,我们只是配置了Remoting的Channel(http:8088)。
为什么需要Remoting
我们都知道现在的Web程序都是多层架构:数据层,商业逻辑层和表示层。这样的好处是代码和表现的分离。这是现在程序设计一个常用的思想,XML和XSLT也是基于同样的思想。
假设我们可以为一个程序写两个表示层,一个是Web Application,另一个是Windows Application,而主要的商业逻辑都放在逻辑层。如果把商业逻辑层的类和对象都作为Remoting对象,我们就可以非常方便的实现这一点。一个具体的例子是Visual Studio .NET自带的Duwamish,这是一个非常好的例子,有很多好的设计思想。
Remoting还有很多其它的应用场景,在此就不一一阐述。

三种不同的Remoting Server对象
Remoting的Server对象有三种,每一种和客户端的交互方式和生命周期都有一些细微的差别。在本文中,我们将为您阐述这三种Server对象之间的差别。
Client Activated 对象
这种对象在Server端的声明方式为:
         <service>
<activated type="ClientActivatedType, RemoteType"/>
</service>
客户端的声明方式为:
         <activated type="ClientActivatedType, RemoteType"/>
表6:Client Activated对象的配置文件
在这种Server端对象的调用方式下,客户端对Server对象调用维持一个固定的链接,因此在两个方法调用之间,变量I的值能够保存。如本文表1~5代码的返回结果是:
Client-activated object: RemoteMethod Called, 162.
Client-activated object: RemoteMethod1 Called, 162.
当然,还有一个对象生命周期的问题,如果超过了对象的生命周期,Server端的对象就会被Garbage Collection程序回收。这是一个很复杂的问题,本文不加阐述,我们只是通过下面的函数把生命周期设为无限。
public override Object InitializeLifetimeService(){
return null;
}
如果对Server端对象的生命周期有兴趣的话,可以参考:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconlifetimeleases.asp
Single Call 对象
这种对象在Server端的声明方式为:
<service>
<wellknown mode="SingleCall" type="ClientActivatedType, RemoteType" 
objectUri="RemoteType.rem" />        
</service>
客户端的声明方式为:
<client url="http://localhost:8088">
<wellknown type="ClientActivatedType, RemoteType" 
url="HTTP://localhost:8088/RemoteType.rem"/>
</client>
表7:Single Call对象的配置文件
在这种Server端对象的调用方式下,客户端对Server对象的每次调用产生一个新的连接,因此在两个方法调用之间,变量I的值不能够保存。如本文表1~5代码的返回结果是:
Client-activated object: RemoteMethod Called, 78.
Client-activated object: RemoteMethod1 Called, 0.
Singleton对象
这种对象在Server端的声明方式为:
<service>
<wellknown mode="Singleton" type="ClientActivatedType, RemoteType" 
objectUri="RemoteType.rem" />        
</service>
客户端的声明方式为:
   <client url="http://localhost:8088">
<wellknown type="ClientActivatedType, RemoteType" 
url="HTTP://localhost:8088/RemoteType.rem"/>
</client>
表7:Single Call对象的配置文件
在这种Server端对象的调用方式下,无论有几个客户端,永远都只有一个Server端对象。如本文表1~5代码的返回结果是:
Client-activated object: RemoteMethod Called, 78.
Client-activated object: RemoteMethod1 Called, 78.
这时,如果另外有一个客户端也启动:CAOClient.exe,返回结果也是:
Client-activated object: RemoteMethod Called, 78.
Client-activated object: RemoteMethod1 Called, 78.
三种对象的简单比较
从上面的比较中我们可以看出,在三种Server端对象中,Singleton的效率最高,但是所有客户端的调用都只能维持一个Server对象;Client Activated的效率最低,但是它对Remoting的屏蔽最好,就像本地调用对象一样。您可以根据不同的使用场景选择不同的Remoting对象。

Remoting和Web Service区别
Remoting和Web Servcie到底有什么样的差别呢?下表是一个简单的比较:
由于Web Service是一个简单的松耦合结构,所以对于对象的状态不予保存。这一点有点像Remoting中的Single Call对象。同样,Web Service目前还不支持Event和回调函数。相比较来说,Remoting还支持效率较高的Binary编码方式。
但是,Remoting只能够运行在.NET Framework之上,而Web Service相应就享有更多、更灵活的选择。 

这篇关于Net Remoting 与 Server 区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/711354

相关文章

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

Go之errors.New和fmt.Errorf 的区别小结

《Go之errors.New和fmt.Errorf的区别小结》本文主要介绍了Go之errors.New和fmt.Errorf的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考... 目录error的基本用法1. 获取错误信息2. 在条件判断中使用基本区别1.函数签名2.使用场景详细对

Redis中哨兵机制和集群的区别及说明

《Redis中哨兵机制和集群的区别及说明》Redis哨兵通过主从复制实现高可用,适用于中小规模数据;集群采用分布式分片,支持动态扩展,适合大规模数据,哨兵管理简单但扩展性弱,集群性能更强但架构复杂,根... 目录一、架构设计与节点角色1. 哨兵机制(Sentinel)2. 集群(Cluster)二、数据分片

SQL Server 查询数据库及数据文件大小的方法

《SQLServer查询数据库及数据文件大小的方法》文章介绍了查询数据库大小的SQL方法及存储过程实现,涵盖当前数据库、所有数据库的总大小及文件明细,本文结合实例代码给大家介绍的非常详细,感兴趣的... 目录1. 直接使用SQL1.1 查询当前数据库大小1.2 查询所有数据库的大小1.3 查询每个数据库的详

Spring Boot 整合 SSE(Server-Sent Events)实战案例(全网最全)

《SpringBoot整合SSE(Server-SentEvents)实战案例(全网最全)》本文通过实战案例讲解SpringBoot整合SSE技术,涵盖实现原理、代码配置、异常处理及前端交互,... 目录Spring Boot 整合 SSE(Server-Sent Events)1、简述SSE与其他技术的对

一文带你迅速搞懂路由器/交换机/光猫三者概念区别

《一文带你迅速搞懂路由器/交换机/光猫三者概念区别》讨论网络设备时,常提及路由器、交换机及光猫等词汇,日常生活、工作中,这些设备至关重要,居家上网、企业内部沟通乃至互联网冲浪皆无法脱离其影响力,本文将... 当谈论网络设备时,我们常常会听到路由器、交换机和光猫这几个名词。它们是构建现代网络基础设施的关键组成

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据

在ASP.NET项目中如何使用C#生成二维码

《在ASP.NET项目中如何使用C#生成二维码》二维码(QRCode)已广泛应用于网址分享,支付链接等场景,本文将以ASP.NET为示例,演示如何实现输入文本/URL,生成二维码,在线显示与下载的完整... 目录创建前端页面(Index.cshtml)后端二维码生成逻辑(Index.cshtml.cs)总结

redis和redission分布式锁原理及区别说明

《redis和redission分布式锁原理及区别说明》文章对比了synchronized、乐观锁、Redis分布式锁及Redission锁的原理与区别,指出在集群环境下synchronized失效,... 目录Redis和redission分布式锁原理及区别1、有的同伴想到了synchronized关键字

解决hive启动时java.net.ConnectException:拒绝连接的问题

《解决hive启动时java.net.ConnectException:拒绝连接的问题》Hadoop集群连接被拒,需检查集群是否启动、关闭防火墙/SELinux、确认安全模式退出,若问题仍存,查看日志... 目录错误发生原因解决方式1.关闭防火墙2.关闭selinux3.启动集群4.检查集群是否正常启动5.