溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解.NET Remoting

發(fā)布時間:2021-11-25 09:48:56 來源:億速云 閱讀:130 作者:柒染 欄目:編程語言

如何理解.NET Remoting,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

.NET Remoting是微軟早期的分布式通信技術,雖然微軟后來通過WCF通用基礎通信框架整合掉了,但是通過回顧學習Remoting,反過來學習理解WCF也是很有幫助的。同時通過這篇博客的學習,可以看到Remoting技術的魅力。

先看一段Wiki百科對于WCF技術的概述。其中就提到了WCF、Web Service、Remoting、Socket等技術。在我提到這些名詞的同時,你應該對這些技術有所了解并清楚這些技術所處于的層次。

Windows Communication Foundation (WCF)是由微軟發(fā)展的一組數(shù)據(jù)通信的應用程序開發(fā)接口,它是.NET框架的一部分,由.NET Framework 3.0開始引入,與Windows Presentation Foundation及 Windows Workflow Foundation并行為新一代Windows操作系統(tǒng)以及WinFX的三個重大應用程序開發(fā)類庫。

在.NET Framework 2.0以及前版本中,微軟發(fā)展了Web Service(SOAP with HTTP communication),.NET Remoting(TCP/HTTP/Pipeline communication)以及基礎的Winsock等通信支持,由于各個通信方法的設計方法不同,而且彼此之間也有相互的重疊性(例如.NET Remoting可以開發(fā)SOAP, HTTP通信),對于開發(fā)人員來說,不同的選擇會有不同的程序設計模型,而且必須要重新學習,讓開發(fā)人員在用戶有許多不便。同時,服務導向架構(Service-Oriented Architecture)也開始盛行于軟件工業(yè)中,因此微軟重新查看了這些通信方法,并設計了一個統(tǒng)一的程序開發(fā)模型,對于數(shù)據(jù)通信提供了最基本最有彈性的支持,這就是Windows Communication Foundation。

其實在早期,還有一些其它的通信技術,比如:MSMQ(消息隊列)、COM、COM+、DCOM等。COM是微軟的重大發(fā)明,將復雜的通信細節(jié)封裝到一個一個的COM組件中,讓.NET程序員可以不用關心復雜的通信細節(jié),只用操作通信模型就可以實現(xiàn)交互操作。

簡單介紹就到這,回過頭來看看Remoting的通信架構圖:

如何理解.NET Remoting

從架構圖可以看到,Remoting可以以對象代理的方式直接操作服務器端的對象的方法。

下面建一個最基本的項目來演示一下Remoting的使用。

先看一下項目的架構:

如何理解.NET Remoting

RemotingServer是一個Remoting服務端控制臺項目;RemotingClient是一個Remoting客戶端控制臺項目;RemotingService是一個類庫項目。

RemotingServer和RemotingClient都需要引用System.Runtime.Remoting這個組件。并且引用RemotingService這個類庫項目。

RemotingServer中的代碼:

static void Main(string[] args)
    {
        TcpServerChannel channel = new TcpServerChannel(8888);
                   
        ChannelServices.RegisterChannel(channel, false);
                   
        RemotingConfiguration.RegisterWellKnownServiceType(typeof(PersonIDConverter), "Hi", WellKnownObjectMode.SingleCall);
                   
        Console.WriteLine("Remoting服務已經(jīng)啟動");
        Console.ReadLine();
    }

RemotingClient中的代碼:

static void Main(string[] args)
    {
        ChannelServices.RegisterChannel(new TcpClientChannel(), false);
              
        PersonIDConverter service = (PersonIDConverter)Activator.GetObject(typeof(PersonIDConverter), "tcp://localhost:8888/Hi");
              
        if (!object.Equals(service, null))
        {
            Console.WriteLine(service.PersonID15To18("130503670401001"));//測試×××號
        }
        Console.ReadLine();
    }

PersonIDConverter中的代碼:

/// <summary>
  /// 遠程服務類,繼承自MarshalByRefObject
  /// </summary>
  public class PersonIDConverter : MarshalByRefObject
  {
      /// <summary>
      /// ×××ID 15轉18位
      /// </summary>
      /// <param name="id">15位×××號</param>
      /// <returns>18位×××號</returns>
      public string PersonID15To18(string id)
      {
          int iS = 0;
          int[] iW = new int[] { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };//加權因子常數(shù) 
          string LastCode = "10X98765432";//校驗碼常數(shù) 
          string newId;//新×××號 
          newId = id.Substring(0, 6);
          newId += "19";//填在第6位及第7位上填上‘1’,‘9’兩個數(shù)字 
          newId += id.Substring(6, 9);
         
          //進行加權求和 
          for (int i = 0; i < 17; i++)
          {
              iS += int.Parse(newId.Substring(i, 1)) * iW[i];
          }
         
          int iY = iS % 11; //取模運算,得到模值 
          newId += LastCode.Substring(iY, 1);//從LastCode中取得以模為索引號的值,加到×××的最后一位,即為新×××號。 
          return newId;
      }
  }

這里面提供了一個×××15位轉18位的服務。

運行時先啟動RemotingServer項目,然后運行RemotingClient項目。

服務端運行后:

如何理解.NET Remoting

客戶端運行后:

如何理解.NET Remoting

可以看到15位×××號成功轉為了18位,Remoting調(diào)用成功。

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI