如何封送處理物件到遠端伺服器以傳址使用 Visual Basic 2005 或 Visual Basic.NET

文章翻譯 文章翻譯
文章編號: 301112 - 檢視此文章適用的產品。
本文已封存。本文係以「現狀」提供且不會再更新。
本文章的有 Microsoft Visual C#.NET] 版本請參閱 307600
全部展開 | 全部摺疊

在此頁中

結論

本文將告訴您,如何封送處理物件以傳到遠端伺服器。 您封送由參考處理物件,執行階段會建立,讓伺服器可以呼叫該物件在用戶端透明 Proxy。 唯一會傳送到伺服器的是 Proxy。 在 Proxy 封送處理呼叫回應給用戶端。

本文分成三個部分: 伺服器物件]、 [伺服器] 應用程式] 及 [用戶端應用程式。它會展開上下列 「 Microsoft 知識庫 」 文件:
300951如何使用 Visual Basic.NET 中建立遠端伺服器
300943如何使用 Visual Basic.NET 中建立遠端伺服器的用戶端存取選項

需求

下列清單列出建議的硬體、 軟體、 網路基礎結構及您需要的服務套件:
  • Microsoft Windows Server 2003,Microsoft Windows 2000 專業版 Windows 2000 Server Windows 2000 進階伺服器或 Microsoft Windows NT 4.0 伺服器
  • Microsoft Visual Studio 2005 或 Microsoft Visual Studio.NET
本文假設您已熟悉下列主題:
  • Visual Studio 2005 或 Visual Studio.NET
  • 基本網路

藉由傳遞物件建立遠端伺服器物件

若要建立伺服器應用程式的第一個步驟是建立伺服器物件。 伺服器物件是什麼用戶端應用程式會具現化,與伺服器電腦進行通訊。 用戶端應用程式會透過在用戶端上建立的 Proxy 物件。 伺服器物件將會位於類別程式庫 (DLL),並稱為 HelloServer。 相同專案中,您也會定義即將要從用戶端傳遞至伺服器的類別。 這個類別會呼叫 ForwardMe。 因為您想要以傳址封送處理 ForwardMe 類別,ForwardMe 類別必須繼承自 MarshalByRefObject
  1. 啟動 Visual Studio 2005 或 Visual Studio.NET。
  2. 建立新的類別程式庫應用程式,並命名 ServerClassRef
  3. 重新命名檔案 Class1.vb 作為 ServerClassRef.vb
  4. 開啟 ServerClassRef.vb,新增稱為 [HelloServer] 及 [兩者都繼承自 MarshalByRefObjectForwardMe 的兩個類別。HelloServer 類別將會用戶端應用程式所使用的主要類別。ForwardMe 類別將用來將物件資料從用戶端傳送到伺服器。 ServerClassRef.vb 程式碼檔案應該如下所示:
    Public Class HelloServer
    	Inherits MarshalByRefObject
    
    End Class
    Public Class ForwardMe
    	Inherits MarshalByRefObject
    
    End Class
    					
  5. 將公用方法加入至 HelloServer 稱為 HelloMethod 採用一個 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 類別。這個方法會取得處理程序執行此段程式碼的名稱。因為只將 Proxy 虛設常式傳送到伺服器,而對用戶端 (以傳址封送處理) 進行回撥,程式碼會執行用戶端處理程序
    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. 關閉並儲存專案。

建立遠端伺服器應用程式

現在建立您的用戶端會與通訊的伺服器物件,您必須以遠端處理架構註冊此物件。註冊不只牽涉到註冊物件,而且還包括啟動伺服器,讓它在用戶端連線的連接埠上接聽。若要執行此動作,您必須將輸出可執行檔的專案類型。伺服器物件包含於個別的專案中,原因是,這樣您可以輕易地從用戶端參考伺服器物件。如果在這個專案中包含您可能不參考它因為參考只能設定至 DLL 檔案。
  1. 啟動 Visual Studio 2005 或 Visual Studio.NET。
  2. 為求簡化的起見,建立新的主控台應用程式啟動遠端伺服器,並命名 ServerObjectRef
  3. 重新命名預設從 Module1.vb ServerObjectRef.vb 來建立檔案。
  4. System.Runtime.Remoting 命名空間的參考加入至專案。
  5. 加入至您在先前的 < > 一節所建立的 ServerClassRef.dll 組件參考。
  6. 遠端處理Remoting.ChannelsRemoting.Channels.TCP 命名空間上使用 Imports 陳述式,所以您不需要限定在稍後的程式碼中的這些命名空間中宣告。 Imports 陳述式必須用來在任何其他宣告之前:
    Imports System.Runtime.Remoting
    Imports System.Runtime.Remoting.Channels
    Imports System.Runtime.Remoting.Channels.TCP
    					
  7. 初始化用戶端在特定埠,在這種情況下連接埠上連線 8085 將接聽的 TcpChannel 物件變數宣告。註冊用戶端會使用,透過使用 RegisterChannel 方法與通道服務進行通訊的通道。將宣告程式碼加入 Module1 中 Main 程序中:
    Dim chan As TcpChannel = New TcpChannel(8085)
    ChannelServices.RegisterChannel(chan)
    					
  8. 藉由呼叫 RegisterWellKnownType 方法 RemotingConfiguration 物件的遠端處理架構登錄 ServerClassRef 物件。您必須指定下列部分:
    1. 完整型別名稱所註冊之物件的在這種情況下 ServerClassRef.HelloServer,後面跟著組件名稱 ServerClassRef。您必須指定命名空間的名稱以及類別名稱。因為您未指定前一節中的命名空間,預設根命名空間用。
    2. 接下來,提供該物件將會發行的端點的名稱。用戶端需要知道這個名稱,才能連接至物件。使用 RemoteTestRef
    3. 最後一個參數會指定可為 SingleCallSingleton 的 [物件] 模式。本範例指定 SingleCall。在伺服器上啟動時,物件模式會指定物件的存留期。在 SingleCall 物件的情況下類別的新執行個體會為建立從用戶端發出的每一個呼叫即使相同的用戶端會呼叫相同的方法一次以上。單一物件另一方面,建立在一次只以及所有的用戶端相同的物件與通訊:
      RemotingConfiguration.RegisterWellKnownServiceType( _
       Type.GetType("ServerClassRef.HelloServer, ServerClassRef"), _
       "RemoteTestRef", _
       WellKnownObjectMode.SingleCall)
      						
  9. 保留伺服器應用程式執行時請使用 主控台 物件 ReadLine 方法:
    Console.WriteLine("Hit <enter> to exit...")
    Console.ReadLine()
    					
  10. 建置您的專案。
  11. 關閉並儲存專案。

藉由傳遞物件建立到遠端伺服器的用戶端

  1. 啟動 Visual Studio 2005 或 Visual Studio.NET。
  2. 建立新的主控台應用程式,並命名 ClientAppRef
  3. 重新命名預設從 Module1.vb ClientAppRef.vb 來建立檔案。
  4. System.Runtime.Remoting 命名空間的參考加入至專案。
  5. 加入至這份文件中先前所建立的 ServerClassRef.dll 組件參考。
  6. 遠端處理Remoting.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. 現在可以宣告並具現化遠端伺服器。在這種情況下您將使用 GetObject 方法 啟動項 物件的執行個體化 HelloServer 物件。您必須指定下列部分:
    1. 所註冊之物件的 [完整的型別] 名稱在這種情況下 ServerClassRef.HelloServer,後面的組件名稱 ServerClassRef。您必須指定名稱之命名空間,以及 classname 這裡。因為您未指定前一節中的命名空間,預設根命名空間用。
    2. 統一資源識別元 (URI) 必須啟動物件。URI 必須包含通訊協定 (TCP)]、 [電腦名稱 (本機)]、 [連接埠 (8085) 和伺服器物件 (RemoteTestRef) 端點。使用 [URI"tcp: / / localhost:8085 / RemoteTestRef"存取 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. 保留用戶端應用程式執行時請使用 主控台 物件 ReadLine 方法:
    Console.WriteLine("Hit <enter> to exit...")
    Console.ReadLine()
    					
  11. 建置您的專案。
  12. 請確定伺服器應用程式正在執行。
  13. 執行專案,然後測試用戶端到伺服器的通訊。 您應該會看到用戶端主控台視窗中顯示輸出。封送您正在處理以傳址,讓回呼會對用戶端。

?考

.NET 遠端處理概觀 (.NET Framework 開發人員指南)

TcpChannel 類別 (.NET Framework 類別庫)

.NET 架構範例-遠端服務
http://msdn.microsoft.com/en-us/library/kwdt6w2k(VS.80).aspx
Microsoft.NET 遠端處理: A 技術概觀 (可能為英文網頁)
http://msdn2.microsoft.com/en-us/library/ms973857.aspx
Activator.GetObject 方法 (.NET Framework 類別庫)

Type.GetType 方法 (.NET Framework 類別庫)

RegisterWellKnownServiceType 方法 (.NET Framework 類別庫)

屬性

文章編號: 301112 - 上次校閱: 2014年2月24日 - 版次: 5.6
這篇文章中的資訊適用於:
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
關鍵字:?
kbnosurvey kbarchive kbmt kbvs2005applies kbvs2005swept kbhowtomaster KB301112 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:301112
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