从简单的示例开始:
1、创建远程对象,在这里创建一个dll程序集,这个dll在服务器和客户机代码中都会用到。
Code
using System;
using System.Collections.Generic;
using System.Text;
namespace PublicService
{
public class HelloServer : MarshalByRefObject
{
public HelloServer()
{
/**////输出信息,服务器激活
Console.WriteLine("服务器激活……");
}
public String HelloMethod(String name)
{
Console.WriteLine(
"服务器端 : {0}", name);
return "这里是:" + name;
}
}
}
2、创建服务器。需要引用System.Runtime.Remoting程序集和之前创建的PublicService.dll程序集。在此创建名为ServerRemoting的Console Application。
名字空间是对象所需要的。请记住,如果得到System.Runtime.Remoting.Channels.Tcp名字空间不存在的信息,请检查是否添加了对System.Runtime.Remoting.dll的引用。
Code
using System;
using System.Net;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Remoting.Channels.Http;
using SimpleRemoting;
namespace ServerRemoting
{
class Program
{
static void Main(string[] args)
{
/**////创建Tcp通道
TcpChannel chan1 = new TcpChannel(8085);
/**////创建Http通道
HttpChannel chan2 = new HttpChannel(8086);
/**////注册通道
ChannelServices.RegisterChannel(chan1);
ChannelServices.RegisterChannel(chan2);
RemotingConfiguration.RegisterWellKnownServiceType
(
typeof(HelloServer),
"SayHello",
WellKnownObjectMode.Singleton
);
System.Console.WriteLine("按任意键退出!");
/**////下面这行不能少
System.Console.ReadLine();
}
}
}
3、创建客户机。需要引用System.Runtime.Remoting程序集和之前创建的PublicService.dll程序集
在此创建名为RemotingClient的Console Application
Code
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Remoting.Channels.Http;
using System.IO;
using SimpleRemoting;
namespace ClientRemoting
{
class Program
{
static void Main(string[] args)
{
/**////使用TCP通道得到远程对象
TcpChannel chan1 = new TcpChannel();
ChannelServices.RegisterChannel(chan1);
HelloServer obj1 = (HelloServer)Activator.GetObject(
typeof(SimpleRemoting.HelloServer),
"tcp://localhost:8085/SayHello");
if (obj1 == null)
{
System.Console.WriteLine(
"连接TCP服务器失败");
}
/**////使用HTTP通道得到远程对象
HttpChannel chan2 = new HttpChannel();
ChannelServices.RegisterChannel(chan2);
HelloServer obj2 = (HelloServer)Activator.GetObject(
typeof(SimpleRemoting.HelloServer),
"http://localhost:8086/SayHello");
if (obj2 == null)
{
System.Console.WriteLine(
"连接HTTP服务器失败");
}
/**////输出信息
Console.WriteLine(
"ClientTCP HelloMethod {0}",
obj1.HelloMethod("Caveman1"));
Console.WriteLine(
"ClientHTTP HelloMethod {0}",
obj2.HelloMethod("Caveman2"));
Console.ReadLine();
}
}
}
注意:
1、本实例在客户端运行HelloClient,但是要在服务器上远程对象注册之后,使服务器上的HelloClient服务一直处于运行状态,直到按任意键为止,否则会出错!
2、将代码中的“tcp://localhost:8085/Hi"”换成其他网址就可以运行在网络上,比如换成:tcp://192.168.3.235:8085/Hi"。
现在我们来先运行服务器,运行结果如图所示:
接着运行客户端,结果如下:
通过以上的简单例子,我们来看Remoting的一些基础知识:
Remoting基础
什么是Remoting,简而言之,我们可以将其看作是一种分布式处理方式。从微软的产品角度来看,可以说Remoting就是DCOM的一种升级,它改善了很多功能,并极好的融合到.Net平台下。Microsoft® .NET Remoting 提供了一种允许对象通过应用程序域与另一对象进行交互的框架。这也正是我们使用Remoting的原因。为什么呢?在Windows操作系统中,是将应用程序分离为单独的进程。这个进程形成了应用程序代码和数据周围的一道边界。如果不采用进程间通信(RPC)机制,则在一个进程中执行的代码就不能访问另一进程。这是一种操作系统对应用程序的保护机制。然而在某些情况下,我们需要跨过应用程序域,与另外的应用程序域进行通信,即穿越边界。
在Remoting中是通过通道(channel)来实现两个应用程序域之间对象的通信的。如图所示:
首先,客户端通过Remoting,访问通道以获得服务端对象,再通过代理解析为客户端对象。这就提供一种可能性,即以服务的方式来发布服务器对象。