HOWTO: Visual Basic .NET을 사용하여 참조에 의해 원격 서버로 개체 마샬링

기술 자료 번역 기술 자료 번역
기술 자료: 301112 - 이 문서가 적용되는 제품 보기.
이 문서는 이전에 다음 ID로 출판되었음: KR301112
이 문서가 보관되었습니다. "그대로" 제공되었으며, 업데이트가 되지 않을 것입니다.
모두 확대 | 모두 축소

이 페이지에서

요약

이 문서에서는 원격 서버에 개체를 참조에 의해 마샬링하는 방법을 보여줍니다. 개체를 참조로 마샬링하면 서버가 클라이언트의 개체를 콜백할 수 있도록 런타임에서 투명한 프록시를 만듭니다. 서버로 보내지는 것은 프록시뿐이며, 프록시는 클라이언트에 콜백을 마샬링합니다.

이 문서는 서버 개체, 서버 응용 프로그램 및 클라이언트 응용 프로그램의 세 부분으로 나뉘어 있습니다. Microsoft 기술 자료의 다음 문서에 이러한 내용이 자세히 설명되어 있습니다.
300951 HOW TO: Create a Remote Server Using Visual Basic .NET
300943 HOW TO: Create Client Access to Remote Server

요구 사항

다음은 권장 하드웨어, 소프트웨어, 네트워크 인프라, 기술 및 지식, 서비스 팩입니다.
  • 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를 열고 HelloServerForwardMe 클래스를 추가합니다. 두 클래스 모두 MarshalByRefObject에서 상속합니다. HelloServer 클래스가 클라이언트 응용 프로그램에서 사용되는 주 클래스가 될 것입니다. ForwardMe 클래스는 클라이언트의 개체 데이터를 서버에 보내는 데 사용될 것입니다. ServerClassRef.vb 코드 파일은 아래와 같습니다.
    Public Class HelloServer
    	Inherits MarshalByRefObject
    
    End Class
    Public Class ForwardMe
    	Inherits MarshalByRefObject
    
    End Class
  5. ForwardMe 개체를 사용하는 public 메서드인 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 메서드를 추가합니다. 이 메서드는 이 코드가 실행될 프로세스의 이름을 가져옵니다. 프록시 스텁을 서버에 보내고 클라이언트를 콜백(참조로 마샬링)하기 때문에 코드는 클라이언트의 프로세스에서 실행됩니다.
    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. 앞서 만든 ServerClassRef.dll 어셈블리에 대한 참조를 추가합니다.
  6. Remoting, 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. RemotingConfiguration 개체의 RegisterWellKnownType 메서드를 호출하여 ServerClassRef 개체를 Remoting 프레임워크에 등록합니다. 다음과 같은 부분을 지정해야 합니다.
    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. Remoting, 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. 이제 원격 서버를 선언하고 인스턴스를 만들 수 있습니다. 이 예에서는 Activator 개체의 GetObject 메서드를 사용하여 HelloServer 개체의 인스턴스를 만듭니다. 다음과 같은 부분을 지정해야 합니다.
    1. 등록할 개체의 전체 형식 이름(이 예에서는 ServerClassRef.HelloServer). 그 뒤에는 어셈블리 이름인 ServerClassRef가 옵니다. 네임스페이스와 클래스의 이름을 둘 다 지정해야 합니다. 앞 절에서 네임스페이스를 지정하지 않았기 때문에 기본 루트 네임스페이스가 사용됩니다.
    2. 활성화해야 할 개체의 URI(Uniform Resource Identifier). URI에는 프로토콜(tcp), 컴퓨터 이름(localhost), 포트(8085), 서버 개체의 종점(RemoteTestValue)이 포함되어야 합니다. "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 Framework Developer's Guide)

TcpChannel Class(.NET Framework Class Library)

.NET Framework Samples - Remoting
http://msdn.microsoft.com/library/techart/remoting.htm
Microsoft .NET Remoting: A Technical Overview(Beta 1 .NET Development [General] Technical Articles):
http://msdn.microsoft.com/library/techart/hawkremoting.htm
Activator.GetObject Method(.NET Framework Class Library)

Type.GetType Method(.NET Framework Class Library)

RegisterWellKnownServiceType Method(.NET Framework Class Library)

속성

기술 자료: 301112 - 마지막 검토: 2014년 2월 24일 월요일 - 수정: 1.0
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Visual Basic .NET 2002 Standard Edition
키워드:?
kbnosurvey kbarchive kbhowto kbhowtomaster KB301112

피드백 보내기

 

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