카테고리 없음

닷넷 리모팅 통신 방법 및 예제

Himer_torr 2023. 6. 27. 23:47
반응형

안녕하세요 🙂

오늘은 닷넷끼리의 쉽게 통신할 수 있도록 구현된 닷넷 리모팅 통신을 소개하려 합니다.

.NET REMOTING 이란?

.NET 프레임워크는 다양한 리모팅 기술을 제공하여 원격 통신을 구현할 수 있습니다. 이는 객체 간 통신(Object-Object Communicatin)을 위한 기능을 제공하며 원격 개체에 대한 프록시 객체를 생성하여 클라이언트에 애플리케이션이 원격 개체를 로컬 개체처럼 사용하는 기술입니다. 객체 간의 통신을 위해 TCP/IP, HTTP 등 프로토콜을 사용하여 데이터를 주고받습니다.

즉 .NET 리모팅 기술은 서버 측에 있는 개체를 클라이언트 측에서 마치 자신에게 있는 개체를 사용하는 것처럼 사용할 수 있게 서비스를 하는 기술입니다.

 

 

 

.NET REMOTING의 장점

1. 편리한 원격 접근 : 닷넷 리모팅을 사용하면 클라이언트 애플리케이션은 원격 서버에 위치한 개체를 마치 로컬에 있는 것처럼 사용할 수 있습니다. 이는 개발자가 별도의 네트워크 통신 및 원격 호출을 구현하지 않아도 되므로 편리합니다.

2. 객체 간 투명한 통신 : 닷넷 리모팅은 객체 간의 통신을 투명하게 처리합니다. 클라이언트는 원격 개체의 메서드를 호출할 때마다 네트워크 상에서의 데이터 전송과 원격 호출을 의식하지 않고 자연스럽게 개발할 수 있습니다.

3. 높은 생산성: 닷넷 리모팅은 개발자가 원격 호출을 위한 상세한 프로토콜 구현을 신경쓰지 않아도 되므로 개발 생산성을 높일 수 있습니다. 또한, .NET Framework의 내장된 도구와 지원 기능을 활용할 수 있어 개발과 디버깅이 간편해집니다.

.NET REMOTING 간단 구현

리모팅 애플리케이션은 3단계로 작성이 됩니다.

  1. 원격 개체 생성
  2. 리모팅 객체를 호스팅하는 애플리케이션 생성
  3. 클라이언트 애플리케이션 생성

그럼 3가지의 프로젝트를 통해서 간단 예제를 보여드리도록 하겠습니다.

 

저는 3가지 프로젝트로 구성하였습니다.


Remoting 프로젝트 내부에는 공통으로 사용될 라이브러리입니다.

공통으로 사용될 인터페이스와 구조체를 선언하였습니다.


두 번째로는 Server입니다.

class Server
{
    
    static void Main(string[] args)
    {
        TcpChannel channel = new TcpChannel(8080);
        ChannelServices.RegisterChannel(channel, false);
        RemotingConfiguration.RegisterWellKnownServiceType(
            typeof(ServerRemoteObject), "RemoteObject", WellKnownObjectMode.Singleton);

        Console.WriteLine("Remoting 서버시작 -8080 포트-");

        Console.ReadLine();
    }
}

class ServerRemoteObject : MarshalByRefObject, Remoting.IRemoteObject
{
    

    public Remoting_Object GetMessage(string name, int count)
    {
       Remoting_Object __struct = new Remoting_Object();

        __struct.Name = name;
        __struct.Count = count;

        return __struct;
    }
}

 

리모팅은 원격 객체에 있는 메소드를 호출하기 위하여 리플렉션을 사용하므로 원격서버에서 ServerRemoteObject 라는 클래스를 제작하였습니다. 클래스를 원격으로 이용하기 위해 MarshalRyRefObject 클래스로부터 파생되게 만들었습니다. 객체가 참조에 의해 마샬링 되면 객체에 대한 참조가 하나의 애플리케이션 도메인에서 다른 애플리케이션 도메인으로 전달됩니다.

그리고 Main 함수 내부에서 TCP채널을 사용하기 위해 포트를 열고 어떤 방식으로 처리할지와 클라이언트에서 원격으로 참조할 수 있는 객체 형식을 등록해 줍니다.


마지막으로 Client입니다.

class Client
{
    static void Main(string[] args)
    {
      
        Remoting.IRemoteObject remoteObject = (Remoting.IRemoteObject)Activator.GetObject(
            typeof(Remoting.IRemoteObject), "tcp://localhost:8080/RemoteObject");

        var message = remoteObject.GetMessage("홍길동", 11);
        Console.WriteLine("서버에서 받은 메시지: " + message.Name);
        Console.ReadLine();
    }
}

클라이언트에서는 Activator.GetObject() 라는 메소드를 호출하면 서버-활성화 코드를 사용하여

IRemoteObject 인 remoteObject를 생성합니다.

서버 애플리케이션은 클라이언트가 객체에 대한 메소드 호출을 실행할 경우에만 이러한 객체들을 사용하게 됩니다. Client에는 따로 서버에서 만든 Class를 만들지 않아도 서버에서 선언된 GetMessage를 사용할 수 있게 됩니다.

https://www.dropbox.com/s/l3zn7vxwy7ync3o/Remoting.zip?dl=0

 

Remoting.zip

Dropbox를 통해 공유함

www.dropbox.com

위에는 예제 파일을 올려두었습니다.

반응형