.NET Remoting 系统是设计用来简化存在于不同应用程序域中的对象之间进行通信的一种体系结构。无论是不是在同一台计算机上。跟Web Service很相似,只不过它们两种各有优点,各用于不同的场合。
.NET Remoting 体系结构:
整个体系结构都是通过一个代理来完成的,这些是内部已经做好的,所以看上去好像没有这个代理似的。当用户产生一个远程类型的实例时,远端就创建了一个代理对象(其实也可以说是远端的一个COPY,因为代理对象的结构和拥有的方法都与远端相似)用户一旦在代理对象中调用一个方法并且该方法是合法的话,即由代理对象发送到服务端,调用服务器对象后,返回客户请求的结果到客户代理。而帮助它们之间进行通讯的就是管道了,主要是运送数据和打包相关协议,并发送到客户端。这是整个流程。
如图:
返回 4 调用服务器对象
6 |--------------------------^ |-----------------------|
| 1 | | 3发送到 |
客户端 --------------> 产生代理对象 --------> 服务端
| | ^ |
| ___调用其方法_____ | __ | __________________ |
2 5返回
.NET Remoting提供一大堆的服务:(只说其中几个)
1 、对象激活和生命周期控制
2 、负责从远程应用程序传输信息和传输信息到远程应用程序的通信管道
3 、管道串行化消息(主要有两种:二进制和SOAP)串行化指将对象的状态转换为可以传输的形式
.NET 远程对象可以被配置成三种不同的类型:
1 、Single Call Object(单次呼叫对象,我自己的理解,呵呵)即此对象被调用一次之后立即释放它,而且不 保存此对象的状态。当有某个客户方法被调用的时候,系统就创建一个新对象,之后释放,即每调用一次创建一个后又释放。
2 、Singleeton Object(单一对象)即所有客户请求都用一个对象来服务,只产生一个对象来服务多个请求。
3 、Client - Activated Object(客户激活对象)可理解为一对一的关系,即每来一个请求,创建一个对象来服务它,并且这种方式可以保存对象状态。
下面看段.NET Remoting的代码:
----------------------------------------------------------------------------------------------------
// 引入必须的名空间,添加引用System.Runtime.Remoting和RemoteObject
using System;
using System.Runtime;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using RemoteObject;
using System.IO;
namespace Server
{
class ServerClass
{
static void Main(string[] args)
{
ChannelServices.RegisterChannel(new TcpServerChannel(9999)); //在9999端口监听
RemotingConfiguration.RegisterWellKnownServiceType(typeof(Remote),"Remote",WellKnownObjectMode.SingleCall);//并注册为单次呼叫类型的对象
Console.WriteLine("The channel has been registered!");
Console.ReadLine();
}
}
}
----------------------------------------------------------------------------------------------
// 同样导入必须的东西
using System;
using System.Runtime;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using RemoteObject;
namespace Client
{
/**//**//**//// <summary>
/// Class1 的摘要说明。
/// </summary>
class ClientClass
{
static void Main(string[] args)
{
ChannelServices.RegisterChannel(new TcpClientChannel());//注册一条管道与server通讯
Remote r=(Remote)Activator.GetObject(typeof(Remote),"tcp://localhost:9999/Remote");//用Activator获取远端对象
Console.WriteLine(r.showdetails());
Console.WriteLine("Welcome to Presto Systems");
Console.ReadLine();
}
}
}
----------------------------------------------------------------------------------------------
using System;
namespace RemoteObject
{
public class Remote :System.MarshalByRefObject //继承MarshalByRefObject使它成为一个远程对象
lic string showdetails()
{
return "All the details are here";
}
}
}
---------------------------------------------------------------------------------------------
.NET Remoting 体系结构:
整个体系结构都是通过一个代理来完成的,这些是内部已经做好的,所以看上去好像没有这个代理似的。当用户产生一个远程类型的实例时,远端就创建了一个代理对象(其实也可以说是远端的一个COPY,因为代理对象的结构和拥有的方法都与远端相似)用户一旦在代理对象中调用一个方法并且该方法是合法的话,即由代理对象发送到服务端,调用服务器对象后,返回客户请求的结果到客户代理。而帮助它们之间进行通讯的就是管道了,主要是运送数据和打包相关协议,并发送到客户端。这是整个流程。
如图:
返回 4 调用服务器对象
6 |--------------------------^ |-----------------------|
| 1 | | 3发送到 |
客户端 --------------> 产生代理对象 --------> 服务端
| | ^ |
| ___调用其方法_____ | __ | __________________ |
2 5返回
.NET Remoting提供一大堆的服务:(只说其中几个)
1 、对象激活和生命周期控制
2 、负责从远程应用程序传输信息和传输信息到远程应用程序的通信管道
3 、管道串行化消息(主要有两种:二进制和SOAP)串行化指将对象的状态转换为可以传输的形式
.NET 远程对象可以被配置成三种不同的类型:
1 、Single Call Object(单次呼叫对象,我自己的理解,呵呵)即此对象被调用一次之后立即释放它,而且不 保存此对象的状态。当有某个客户方法被调用的时候,系统就创建一个新对象,之后释放,即每调用一次创建一个后又释放。
2 、Singleeton Object(单一对象)即所有客户请求都用一个对象来服务,只产生一个对象来服务多个请求。
3 、Client - Activated Object(客户激活对象)可理解为一对一的关系,即每来一个请求,创建一个对象来服务它,并且这种方式可以保存对象状态。
下面看段.NET Remoting的代码:
----------------------------------------------------------------------------------------------------
// 引入必须的名空间,添加引用System.Runtime.Remoting和RemoteObject
using System;
using System.Runtime;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using RemoteObject;
using System.IO;
namespace Server
{
class ServerClass
{
static void Main(string[] args)
{
ChannelServices.RegisterChannel(new TcpServerChannel(9999)); //在9999端口监听
RemotingConfiguration.RegisterWellKnownServiceType(typeof(Remote),"Remote",WellKnownObjectMode.SingleCall);//并注册为单次呼叫类型的对象
Console.WriteLine("The channel has been registered!");
Console.ReadLine();
}
}
}
----------------------------------------------------------------------------------------------
// 同样导入必须的东西
using System;
using System.Runtime;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using RemoteObject;
namespace Client
{
/**//**//**//// <summary>
/// Class1 的摘要说明。
/// </summary>
class ClientClass
{
static void Main(string[] args)
{
ChannelServices.RegisterChannel(new TcpClientChannel());//注册一条管道与server通讯
Remote r=(Remote)Activator.GetObject(typeof(Remote),"tcp://localhost:9999/Remote");//用Activator获取远端对象
Console.WriteLine(r.showdetails());
Console.WriteLine("Welcome to Presto Systems");
Console.ReadLine();
}
}
}
----------------------------------------------------------------------------------------------
using System;
namespace RemoteObject
{
public class Remote :System.MarshalByRefObject //继承MarshalByRefObject使它成为一个远程对象
lic string showdetails()
{
return "All the details are here";
}
}
}
---------------------------------------------------------------------------------------------