Visual C#을 사용하여 원격 서버 만들기

이 문서는 Visual C#을 사용하여 다른 애플리케이션이 액세스할 수 있는 원격 서버를 만드는 데 도움이 됩니다.

원래 제품 버전: Visual C#
원본 KB 번호: 307445

요약

이 문서에서는 다른 애플리케이션이 액세스할 수 있는 원격 서버를 만드는 방법을 보여 줍니다. 이 서버에 액세스하는 애플리케이션은 동일한 컴퓨터, 다른 컴퓨터 또는 다른 네트워크에 있을 수 있습니다. 원격 서버는 서버 개체와 서버 애플리케이션의 두 부분으로 구분됩니다. 서버 개체는 클라이언트가 통신하는 개체이며 서버 애플리케이션은 서버 개체를 .NET 원격 런타임 프레임워크에 등록하는 데 사용됩니다.

이 문서에서는 다음 Microsoft .NET Framework 클래스 라이브러리 네임스페이스를 참조합니다.

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

요구 사항

이 문서에서는 다음과 같은 topics 잘 알고 있다고 가정합니다.

  • Visual Studio .NET 또는 Visual Studio
  • Visual C# .NET 또는 Visual C#
  • 네트워킹

원격 서버 개체 만들기

서버 애플리케이션을 만드는 첫 번째 단계는 서버 개체를 만드는 것입니다. 서버 개체는 클라이언트 애플리케이션이 서버 컴퓨터에서 인스턴스화하고 통신하는 개체입니다. 클라이언트 애플리케이션은 클라이언트에서 만든 프록시 개체를 통해 이 작업을 수행합니다. 이 샘플에서 서버 개체는 DLL(클래스 라이브러리)에 있으며 myRemoteClass라고 합니다.

  1. Visual C# .NET에서 새 클래스 라이브러리 애플리케이션을 만듭니다. 프로젝트 이름을 ServerClass로 지정합니다. Class1은 기본적으로 만들어집니다.

  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. 문자열을 사용하고, 문자열 값을 사용하여 콘솔에 메시지를 표시하고, 문자열이 비어 있지 않으면 True를 반환하는 public 메서드를 myRemoteClass에 추가합니다.

    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. 프로젝트를 저장하고 닫습니다.

원격 서버 애플리케이션 만들기

클라이언트가 통신할 서버 개체를 만든 후에는 이 개체를 Remoting 프레임워크에 등록해야 합니다. 개체를 등록할 때 서버를 시작하고 클라이언트가 해당 포트에 연결할 수 있도록 서버가 포트에서 수신 대기하도록 해야 합니다. 이렇게 하려면 실행 파일을 출력하는 프로젝트 형식이 필요합니다.

서버 개체를 별도의 프로젝트에 포함시키는 이유는 클라이언트 프로젝트에서 서버 개체를 쉽게 참조할 수 있기 때문입니다. 참조는 DLL 파일로만 설정할 수 있으므로 이 프로젝트에 포함하면 참조할 수 없습니다.

  1. Visual C# .NET에서 새 콘솔 애플리케이션을 만들어 원격 서버를 시작합니다. Class1 은 기본적으로 만들어집니다.

  2. 솔루션 탐색기 Class1.cs 파일의 이름을 RemoteServer.cs.

  3. 네임스페이스에 대한 참조를 System.Runtime.Remoting 추가합니다.

  4. 이전 섹션에서 만든 ServerClass.dll 어셈블리에 대한 참조를 추가합니다.

  5. 코드의 using 뒷부분 Remoting에서 해당 네임스페이스에서 선언을 한정할 필요가 없도록 , Remoting.ChannelsRemoting.Channels.TCP 네임스페이스의 문을 사용합니다. 다른 선언 전에 using 문을 사용해야 합니다.

    using System.Runtime.Remoting;
    using System.Runtime.Remoting.Channels;
    using System.Runtime.Remoting.Channels.Tcp;
    
  6. 적절한 변수를 선언합니다. 이 예제의 TcpChannel 포트 8085인 특정 포트에서 클라이언트가 연결하도록 수신 대기하는 개체를 선언하고 초기화합니다. 메서드를 RegisterChannel 사용하여 채널을 채널 서비스에 등록합니다. 의 프로시저Class1Main 다음 선언 코드를 추가합니다.

    TcpChannel chan = new TcpChannel(8085);
    ChannelServices.RegisterChannel(chan);
    
  7. 개체의 RegisterWellKnownType 메서드를 RemotingConfiguration 호출하여 개체를 ServerClass Remoting 프레임워크에 등록하고 다음 매개 변수를 지정합니다.

    • 등록 중인 개체의 전체 형식 이름(이 예제에서는 ServerClass.myRemoteClass ) 뒤에 어셈블리 이름 ServerClass가 있습니다. 네임스페이스의 이름과 여기에 클래스 이름을 모두 지정합니다. 이전 섹션에서 네임스페이스를 지정하지 않았기 때문에 기본 루트 네임스페이스가 사용됩니다.

    • 개체를 RemoteTest로 게시할 엔드포인트의 이름을 지정합니다. 클라이언트는 개체에 연결하기 위해 이 이름을 알아야 합니다.

    • 개체 모드를 SingleCall 사용하여 최종 매개 변수를 지정합니다. 개체 모드는 서버에서 활성화될 때 개체의 수명을 지정합니다. 개체의 SingleCall 경우 동일한 클라이언트가 동일한 메서드를 두 번 이상 호출하더라도 클라이언트가 만드는 각 호출에 대해 클래스의 새 instance 만들어집니다. 반면 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 개발자 가이드 설명서를 참조하세요.