简介
•.net remoting是.net在RPC分布式应用的技术。首先,客户端通过 remoting访问通道以获得服务端对象,再通过代理解析为客户端对象,通过通道来实现远程对象的调用。
原理
•远程对象代码可以运行在服务器上,然后客户端再通过 remoting中定义的通道连接服务器,获得该服务对象并通过序列化在客户端运行。
•通道即服务端与客户端之间通过IP地址和端口号建立的传输序列化对象的途径。
TCP通道
•remoting 的通道主要有两种:tcp 和 http。
•在.net中,system.runtime.remoting.channel 中定义了 ichannel 接口。ichannel 接口包括了 tcpchannel 通道类型和 http 通道类型。它们分别对应 remoting 通道的这两种类型。
•tcpchannel 类型
tcp通道提供了基于 socket 的传输工具, 使用tcp协议
来传输序列化的消息流。 tcpchannel类型默认使用二进制格式序列化消息对象,因此它具有更高的传输性能。
激活可序列化的对象
•在访问远程类型的一个对象实例之前,必须通过一个名为 activation 的进程创建它并进行初始化。这种客户端
通过通道来创建远程对象,称为对象的激活。
•在 remoting中,远程对象的激活分为两大类:
服务器端激活和客户端激活。
•.net remoting 把服务器端激活又分为 singleton 模式和singlecall 模式两种。
•singlecall 是一种无状态模式。一旦设置为singlecall 模式,则当客户端调用远程对象的方法时,remoting 会为每一个客户端建立一个远程对象实例。
•singleton 模式:此为有状态模式。如果设置为 singleton 激活方式,则 remoting 将为所有客户端建立同一个对象实例。当对象处于活动状态时,singleton 实例会处理所有后来的客户端访问请求,而不管它们是同一个客户端,还是其他客户端。singleton 实例将在方法调用中一直维持其状态。
•由于 remoting 传递的对象是以引用的方式,因此所传递的远程对象类必须继承marshalbyrefobject。
•因此,有了可以传输的对象,有了传输的通道,那么客户端就可以利用通道调用服务端的对象了。
Remoting是一个分布式处理服务。服务器端首先创建通道,并自动开启监听通道。根据客户端发出的请求,传递远程对象。
因此,编写Remoting程序,主要分为三部分: 1、被传递的远程对象; 2、服务器端监听程序; 3、客户端请求和处理对象程序;
第一步:先定义可序列化的远程对象。 须继承 MarshalByRefObject对象, 是通过使用代理交换消息来跨越应用程序域边界进行通信的对象的基类。
namespace RemotingModal
{
public class RemotingModal:MarshalByRefObject
{
//远程对象
public void GetMessage(string word)
{
System.Console.WriteLine(word);
}
}
}
第二步:服务器端:是一个控制台,首先要添加对System.Runtime.Remoting的引用,然后添加对RemotingModal的引用 。
1、定义服务端监听端口。 2、注册通道。3、定义激活方式激活远程对象。
static void Main(string[] args)
{ //注册通道 TcpServerChannel Channel = new TcpServerChannel(9200); ChannelServices.RegisterChannel(Channel, false); Console.WriteLine("服务已启动,请不要关闭服务!");//注册远程对象
RemotingConfiguration.RegisterWellKnownServiceType(typeof(CaseInfoModal.CaseInfoModal), "CaseInfoModal.rem", WellKnownObjectMode.Singleton); Console.ReadLine(); } 第三步:客户端:
1、注册TCP通道2、激活远程服务对象3、获得远程对象的方法
private void button1_Click(Object sender,EventArgs e)
{
try{
string serverPath = ConfigurationManager.AppSettings["ServerPath"];
string url = "tcp://" + serverPath.Trim() + @"/RemotingModal.rem"; _server = (RemotingModal.RemotingModal)Activator.GetObject(typeof(RemotingModal.RemotingModal), url);_server.GetMessage("传入值");
textBox1.Text="输出值";
}
catch(Exception e){
MessageBox.Show(ex.Message);
}
}