access_time 13 years ago language中文
more_vert

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

visibility 511 comment 0

.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.
Like this article?
Share on

Please log in or register to comment.

account_circle Log in person_add Register

Log in with external accounts

Follow Kontext

Get our latest updates on LinkedIn.

Want to contribute on Kontext to help others?

Learn more

More from Kontext

visibility 8956
thumb_up 0
access_time 4 years ago
visibility 567
thumb_up 0
access_time 5 months ago