HOW TO:使用 Visual Basic .NET 按引用将对象封送到远程服务器

文章翻译 文章翻译
文章编号: 301112 - 查看本文应用于的产品
本文的发布号曾为 CHS301112
本文已归档。它按“原样”提供,并且不再更新。
展开全部 | 关闭全部

本文内容

概要

本文演示如何按引用将对象封送到远程服务器。在按引用封送对象时,运行库创建一个透明的代理,以便服务器能够回调客户机上的该对象。 发送到服务器的唯一的事物是代理。 该代理将回调封送到客户机。

本文分为三个部分: 服务器对象、服务器应用程序和客户端应用程序。 它在下列 Microsoft 知识库文章中展开讨论:
300951 HOW TO: Create a Remote Server by Using Visual Basic .NET(使用 Visual Basic .NET 创建远程服务器)
300943 HOW TO: Create Client Access to Remote Server by Using Visual Basic .NET(使用 Visual Basic .NET 创建对远程服务器的客户端访问)

要求

以下各项描述了推荐使用的硬件、软件、网络结构、技能、知识和所需要的 Service Pack:
  • Windows 2000 Professional、Windows 2000 Server、Windows 2000 Advanced Server 或 Windows NT 4.0 Server
  • Visual Studio .NET
下面列出了在执行这些步骤之前应掌握的知识:
  • Visual Studio .NET
  • 基本网络

通过传递对象来创建远程服务器对象

创建服务器应用程序的第一步是创建服务器对象。服务器对象在服务器上,客户端应用程序要实例化它并与之通讯。客户端应用程序是通过客户机上创建的代理对象实现这一点的。 服务器对象将驻留在类库 (DLL) 中,并被称为 HelloServer。在同一个项目中,还需要定义将从客户机传递到服务器的类。 该类将被称为 ForwardMe。 由于您希望对 ForwardMe 类按引用来进行封送,所以 ForwardMe 类必须从 MarshalByRefObject 继承而来。
  1. 打开 Visual Studio .NET。
  2. 新建一个类库应用程序并将其命名为 ServerClassRef
  3. 将文件 Class1.vb 重命名为 ServerClassRef.vb
  4. 打开 ServerClassValue.vb,并添加两个名称分别为 HelloServer ForwardMe 的类,这两个类均从 MarshalByRefObject 继承而来。 HelloServer 类将是由客户端应用程序使用的主类。 ForwardMe 类用于将对象数据从客户机发送到服务器。 ServerClassRef.vb 代码文件应类似于如下代码:
    Public Class HelloServer
    	Inherits MarshalByRefObject
    
    End Class
    Public Class ForwardMe
    	Inherits MarshalByRefObject
    
    End Class
  5. 将一个名为 HelloMethod 的公共方法添加到 HelloServer,此方法将接受 ForwardMe 对象。您将使用此方法把 ForwardMe 对象传递到服务器。此方法调用这一对象的 CallMe 方法。 HelloServer 类的代码现在应如下所示:
    Public Class HelloServer
        Inherits MarshalByRefObject
    
        Public Sub HelloMethod(ByRef obj As ForwardMe)
    Dim i As Integer
    obj.CallMe()
    End Sub
    End Class
  6. 给 ForwardMe 类添加一个公共方法。 此方法将获取正在执行此代码的进程的名称。因为只是要将代理存根传递到服务器并回调客户机(按引用封送),所以,此代码在客户机的进程中执行。
    Public Class ForwardMe
        Inherits MarshalByRefObject
    
        Public Function CallMe() As Object
    Console.WriteLine("CallMe was executed in: " & _
            Process.GetCurrentProcess.ProcessName.ToString)
    End Function
    
    End Class
  7. 生成该项目以创建 ServerClassRef.dll 程序集。
  8. 关闭并保存项目。

创建远程服务器应用程序

创建客户机将与之通讯的服务器对象之后,必须向 Remoting 框架注册此对象。注册不仅包括将对象进行注册,还包括启动服务器并让它侦听一个端口以便客户机进行连接。为此,您需要一个能输出可执行文件的项目类型。 之所以将服务器对象包括在另外一个单独的项目中,是因为这样可以方便地从客户机中引用服务器对象。如果将服务器对象包含在原项目中,则您不能引用该对象,这是因为只能设置对 DLL 文件的引用。
  1. 打开 Visual Studio .NET。
  2. 为简明起见,请新建一个控制台应用程序以启动远程服务器,并将它命名为 ServerObjectRef
  3. 将默认情况下创建的文件从 Module1.vb 重命名为 ServerObjectRef.vb
  4. 给项目添加一个到 System.Runtime.Remoting 命名空间的引用。
  5. 添加一个对上一部分中创建的 ServerClass.dll 程序集的引用。
  6. RemotingRemoting.ChannelsRemoting.Channels.TCP 命名空间中使用 Imports 语句,这样以后就不需要在代码中限定这些命名空间中的声明了。Imports 语句必须放在所有其他声明之前:
    Imports System.Runtime.Remoting
    Imports System.Runtime.Remoting.Channels
    Imports System.Runtime.Remoting.Channels.TCP
  7. 声明一个变量以初始化 TcpChannel 对象,该对象将侦听一个端口(在本例中为 8085)以便客户机进行连接。使用 RegisterChannel 方法向通道服务注册客户机进行通讯时要使用的通道。在 Module1 的 Main 过程中添加声明代码:
    Dim chan As TcpChannel = New TcpChannel(8085)
    ChannelServices.RegisterChannel(chan)
  8. 通过调用 RemotingConfiguration 对象的 RegisterWellKnownType 方法,向 Remoting 框架注册 ServerClassRef 对象。必须指定下列信息:
    1. 正在注册的对象的完整类型名称(在本例中为 ServerClassRef.HelloServer),后面为程序集名称 ServerClassRef。必须指定命名空间的名称和类名。因为在前面的部分中没有指定命名空间,所以使用默认的根命名空间。
    2. 接下来,提供对象将要发布到的终结点的名称。客户机需要知道此名称以便连接到该对象。 请使用 RemoteTestRef
    3. 最后一个参数指定对象模式,可以是 SingleCall Singleton 模式。本例指定 SingleCall。对象模式指定了在服务器上激活该对象时的有效期。 对于 SingleCall 对象,针对客户机的每次调用都会创建类的一个新实例,即使在同一客户机多次调用同一方法的情况下也是如此。而 Singleton 对象则只创建一次,所有的客户机都与同一个对象进行通讯:
      RemotingConfiguration.RegisterWellKnownServiceType( _
      Type.GetType("ServerClassRef.HelloServer, ServerClassRef"), _
       "RemoteTestRef", _
      WellKnownObjectMode.SingleCall)
  9. 使用 Console 对象的 ReadLine 方法来使服务器应用程序保持运行。
    Console.WriteLine("Hit <enter> to exit...")
    Console.ReadLine()
  10. 生成您的项目。
  11. 关闭并保存项目。

通过传递对象来创建远程服务器的客户端

  1. 打开 Visual Studio .NET。
  2. 新建一个控制台应用程序,并将它命名为 ClientAppRef
  3. 将默认情况下创建的文件从 Module1.vb 重命名为 ClientAppRef.vb
  4. 给项目添加一个到 System.Runtime.Remoting 命名空间的引用。
  5. 添加一个对本文档前面创建的 ServerClassRef.dll 程序集的引用。
  6. RemotingRemoting.ChannelsRemoting.Channels.TCP 命名空间中使用 Imports 语句,这样以后就不需要在代码中限定这些命名空间中的声明了。Imports 语句必须放在所有其他声明之前:
    Imports System.Runtime.Remoting
    Imports System.Runtime.Remoting.Channels
    Imports System.Runtime.Remoting.Channels.TCP
  7. 声明一个变量以初始化一个 TcpChannel 对象,客户机将使用该对象连接到服务器应用程序。初始化 TcpChannel 对象时,必须指定端口以启用双向通讯。 这是必需的,因为您在按引用来封送对象,并且服务器将需要对客户机进行回调。 通过使用此端口即可实现这一点。 该端口应与用于发送数据的端口不同。 使用 RegisterChannel 方法向通道服务注册该通道。然后,必须初始化一个新的 ForwardMe 对象,该对象将被传递到远程服务器。在 Module1 的 Main 过程中添加声明代码:
    Dim chan As TcpChannel = New TcpChannel(8086)
    ChannelServices.RegisterChannel(chan)
    Dim objForwardMe As New ServerClassRef.ForwardMe()
  8. 现在您可以声明和实例化远程服务器了。 在本例中,您将使用 Activator 对象的 GetObject 方法来实例化 HelloServer 对象。必须指定下列信息:
    1. 正在注册的对象的完整类型名称(在本例中为 ServerClassRef.HelloServer),后面为程序集名称 ServerClassRef。此外,必须指定命名空间的名称和类名。因为在前面的部分中没有指定命名空间,所以使用默认的根命名空间。
    2. 需要激活的对象的统一资源标识符 (URI)。URI 必须包含协议 (tcp)、计算机名 (localhost)、端口 (8085) 和服务器对象的终结点 (RemoteTestRef)。 应使用“tcp://localhost:8085/RemoteTestRef”作为 URI 来访问 ServerClass 远程服务器。
      Dim objHelloServer As ServerClassRef.HelloServer
      
      objHelloServer = CType(Activator.GetObject( _
      Type.GetType("ServerClassRef.HelloServer, ServerClassRef"), _
      "tcp://localhost:8085/RemoteTestRef"), _
          ServerClassRef.HelloServer)
      If objHelloServer Is Nothing Then
      Console.WriteLine("Could not locate server")
      Else
      'See next step
      End If
  9. 如果服务器对象实例化成功,则可以调用服务器对象的方法并将新创建的 objForwardMe 对象传递给该方法。 修改后的字符串应作为结果返回,因此需要显示:
    Dim objHelloServer As ServerClassRef.HelloServer
    
    objHelloServer = CType(Activator.GetObject( _
    	Type.GetType("ServerClassRef.HelloServer, ServerClassRef"), _
    	"tcp://localhost:8085/RemoteTestRef"), _
    	ServerClassRef.HelloServer)
    If objHelloServer Is Nothing Then
    	Console.WriteLine("Could not locate server")
    Else
    	objHelloServer.HelloMethod(objForwardMe)
    End If
  10. 使用 Console 对象的 ReadLine 方法来使客户端应用程序保持运行。
    Console.WriteLine("Hit <enter> to exit...")
    Console.ReadLine()
  11. 生成您的项目。
  12. 确保服务器应用程序在运行。
  13. 运行该项目,并测试客户机与服务器之间的通讯。 您会看到在客户机的控制台窗口中显示的输出。 由于您在按引用来封送对象,所以将发生对客户机的回调。

参考

.NET Remoting Overview(.NET 框架开发人员指南)

TcpChannel Class(.NET 框架类库)

.NET Framework Samples - Remoting
http://msdn.microsoft.com/library/techart/remoting.htm
Microsoft .NET Remoting: A Technical Overview(Beta 1 .NET 开发 [一般] 技术文章):
http://msdn.microsoft.com/library/techart/hawkremoting.htm
Activator.GetObject Method(.NET 框架类库)

Type.GetType Method(.NET 框架类库)

RegisterWellKnownServiceType Method(.NET 框架类库)

属性

文章编号: 301112 - 最后修改: 2014年2月24日 - 修订: 1.0
这篇文章中的信息适用于:
  • Microsoft Visual .NET 2002 标准版
关键字:?
kbnosurvey kbarchive kbhowto kbhowtomaster KB301112
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com