通过


使用 Visual C# 创建远程服务器

本文可帮助你创建远程服务器,其中另一个应用程序可以使用 Visual C# 进行访问。

原始产品版本: Visual C#
原始 KB 数: 307445

总结

本文说明如何创建另一个应用程序可以访问的远程服务器。 访问此服务器的应用程序可以位于同一台计算机、另一台计算机或其他网络上。 远程服务器分为两部分:服务器对象和服务器应用程序。 服务器对象是客户端与之通信的对象,服务器应用程序用于将服务器对象注册到 .NET 远程处理运行时框架。

本文介绍以下Microsoft .NET Framework 类库命名空间:

  • System.Runtime.Remoting
  • System.Runtime.Remoting.Channels
  • System.Runtime.Remoting.Channels.Tcp

要求

本文假定你熟悉以下主题:

  • Visual Studio .NET 或 Visual Studio
  • Visual C# .NET 或 Visual C#
  • 网络

创建远程服务器对象

创建服务器应用程序的第一步是创建服务器对象。 服务器对象是客户端应用程序在服务器计算机上实例化和通信的内容。 客户端应用程序通过在客户端上创建的代理对象执行此操作。 在此示例中,服务器对象驻留在类库(DLL)中,称为 myRemoteClass

  1. 在 Visual C# .NET 中创建新的类库应用程序。 将 project ServerClass 命名。 类 1 默认创建。

  2. 在解决方案资源管理器中,将Class1.cs代码文件重命名为ServerClass.cs

  3. 打开ServerClass.cs并将 Class1 重命名myRemoteClass。 还需要重命名类的默认构造函数,使其与类名匹配。 myRemoteClass 应继承自 MarshalByRefObject 该类。 你的类现在应如下所示:

    public class myRemoteClass: MarshalByRefObject
    {
        public myRemoteClass()
        {
          // TO DO: Add constructor logic here.
        }
    }
    
  4. 向 myRemoteClass 添加一个公共方法,该方法采用字符串,向控制台显示一条消息,其中包含字符串值,如果字符串不为空,则返回 True

    public bool SetString(String sTemp)
    {
         try
         {
             Console.WriteLine("This string '{0}' has a length of {1}", sTemp, sTemp.Length);
             return sTemp != "";
         }
         catch
         {
             return false;
         }
    }
    
  5. 生成项目以创建 ServerClass.dll 程序集。

  6. 保存并关闭项目。

创建远程服务器应用程序

创建客户端将与之通信的服务器对象后,必须将此对象注册到远程处理框架。 注册对象时,还必须启动服务器,让服务器侦听端口,客户端才能连接到该端口。 为此,需要一个输出可执行文件的项目类型。

将服务器对象包含在单独的项目中的原因是,可以轻松地从客户端项目中引用服务器对象。 如果在此项目中包括它,则无法引用它,因为只能将引用设置为 DLL 文件。

  1. 在 Visual C# .NET 中创建新的控制台应用程序以启动远程服务器。 类 1 默认创建。

  2. 在解决方案资源管理器中,将Class1.cs文件重命名为RemoteServer.cs

  3. 添加对命名空间的 System.Runtime.Remoting 引用。

  4. 添加对 在上一节中创建的 ServerClass.dll程序集的引用。

  5. usingRemoting.ChannelsRemoting.Channels.TCP命名空间使用语句Remoting,以便你无需在代码后面限定这些命名空间中的声明。 在任何其他声明之前,必须使用 using 该语句。

    using System.Runtime.Remoting;
    using System.Runtime.Remoting.Channels;
    using System.Runtime.Remoting.Channels.Tcp;
    
  6. 声明相应的变量。 声明并初始化一个 TcpChannel 对象,该对象侦听客户端连接到特定端口,在本示例中为端口 8085。 RegisterChannel使用该方法向通道服务注册通道。 在 Main 以下过程中 Class1添加以下声明代码:

    TcpChannel chan = new TcpChannel(8085);
    ChannelServices.RegisterChannel(chan);
    
  7. RegisterWellKnownType调用对象的方法RemotingConfiguration以将对象注册ServerClass到远程处理框架,并指定以下参数:

    • 要注册的对象的完整类型名称(在本示例中为 ServerClass.myRemoteClass ),后跟程序集名称 ServerClass。 在此处指定命名空间的名称和类名称。 由于上一节中未指定命名空间,因此使用默认根命名空间。

    • 将对象发布为 RemoteTest 的终结点命名。 客户端需要知道此名称才能连接到对象。

    • 使用 SingleCall 对象模式指定最终参数。 对象模式指定在服务器上激活对象的生存期。 对于 SingleCall 对象,即使同一客户端多次调用同一方法,也会为每个客户端发出的调用创建类的新实例。 另一方面, Singleton 对象只创建一次,所有客户端都与同一对象通信。

      RemotingConfiguration.RegisterWellKnownServiceType(
      System.Type.GetType("ServerClass.myRemoteClass, ServerClass"),
      "RemoteTest",
      WellKnownObjectMode.SingleCall);
      
  8. ReadLine使用对象的方法Console使服务器应用程序保持运行。

    System.Console.WriteLine("Hit <enter> to exit...");
    System.Console.ReadLine();
    
  9. 生成项目。

  10. 保存并关闭项目。

参考

有关 .NET 远程处理概述,请参阅 .NET Framework 开发人员指南文档。