language中文

.net Remoting 基础学习教程(一)

visibility 577 comment 0 access_time 13 years ago

.net Remoting 可以用于处理激活、分布式验证、生存期和调用环境等方面的工作。它与Xml Web Service不同,在Xml Web Service中对象是抽象的,客户部需要知道服务器对象的类型,且与.net Remoting 不同,它是独立于平台的。.net Remoting 可以用于访问另一个应用程序域中的对象,无论两者处于同一进程还是不同的进程或者不同的系统中,都可以进行相互间的访问。

示意图如下:

下面以一个简单的例子进行介绍,这个例子是Wrox出版的《C#高级编程第四版》中.net Remoting章节的例子。

先建一个类库项目,取名为DoNetRemoting

其中有个类Hello,代码如下:

using System;
using System.Collections.Generic;
using System.Text;

namespace DotNetRemoting
{
   public class Hello : MarshalByRefObject
   {
      public Hello()
      {
         Console.WriteLine("Constructor called.");
      }

      ~Hello()
      {
         Console.WriteLine("Destructor called.");
      }

      public string Greeting(string name)
      {
         Console.WriteLine("Greeting called");
         return "Hello," + name;
      }
   }
}

这只是一个很简单的类,用于测试。

再新建一个.net Remoting服务器上要用到的控制台项目RemotingServer,且引用DotNetRemoting项目以及System.Runtime.Remoting组件

其中的Program类如下:

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting;
using DotNetRemoting;

namespace RemotingServer
{
   class Program
   {
      static void Main(string[] args)
      {
         TcpServerChannel channel = new TcpServerChannel(8086);
         ChannelServices.RegisterChannel(channel, false);
         RemotingConfiguration.RegisterWellKnownServiceType(typeof(Hello), "Hi", WellKnownObjectMode.SingleCall);
         Console.WriteLine("press any key to exit.");
         Console.ReadLine();

      }
   }
}

这个类中的TcpServerChannel channel = new TcpServerChannel(8086);语句表示要创建服务器TCP端口8086的信道,用于接收客户端的请求等(自己对于通信,不是很了解,如果出现了一些描述性或者通信方面的知识错误,恳请大家指正),这个端口可以自己更改,但要注意防火墙是否屏蔽了此端口,否则客户端无法连接的。

再新建个项目也是控制台应用程序RemotingClient,也要引用DotNetRemoting项目以及System.Runtime.Remoting组件

其中的Program类的代码如下:

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using DotNetRemoting;

namespace RemotingClient
{
   class Program
   {
      static void Main(string[] args)
      {
         ChannelServices.RegisterChannel(new TcpClientChannel(), false);
         Hello obj = (Hello)Activator.GetObject(typeof(Hello), "tcp://localhost:8086/Hi");
         if (obj == null)
         {
            Console.WriteLine("cannot locate server.");
            return;
         }
         else
         {
            for (int i = 0; i < 5; i++)
            {
               Console.WriteLine(obj.Greeting("Raymond"));
            }
         }
         Console.ReadLine();
      }
   }
}

其中的语句Hello obj = (Hello)Activator.GetObject(typeof(Hello), "tcp://localhost:8086/Hi");则是创建对服务器端对象的访问代理,这里的tcp://localhost:8086/Hi表示我在本地测试的,8086是服务器端的端口,而Hi则是RemotingConfiguration.RegisterWellKnownServiceType(typeof(Hello), "Hi", WellKnownObjectMode.SingleCall);中的名称标识Hi

最终解决方案布局如下:

设置解决方案的属性为多启动项目,同时启动RemotingClient和RemotingServer 项目,按F5启动调试则可以看到下面的结果:

这个是服务器端的运行结果

下面的是客服端的运行结果

如果你的有防火墙则需要开启tcp的8086端口

下面我将客户端部署到我电脑上的虚拟机上Windows Server 2003,同时把tcp://localhost:8086/Hi中的Localhost更改为我主机的电脑。

把主机上的服务器端的RemotingServer控制台应用程序开启

再点击虚拟机里边的RemotingClient.exe就可以看到下面的运行结果

而此时主机上的服务器端结果如下(虚拟机上我连续运行了两次):

info Last modified by Raymond 13 years ago copyright This page is subject to Site terms.

Subscribe newsletter

Please log in or register to comment.

account_circle Log in person_add Register

Log in with external accounts