posted by 써니루루 2007. 3. 28. 12:53

.NET Remoting이란?

  • RPC(Remote Procedure Call)

    • 클라이언트가 원격지에 존재하는 함수를 호출한 후, 그 결과를 원격지로부터 받아내는 기술
  • 리모팅(Remotion)
    • 리모팅은 서비스 개념을 포함한다
    • 원격 서버가 클라이언트에게 서비스(Service)를 제공한다.
  • 닷넷 리모팅에서 소개되는 기술
    • 원격 객체(Remote Object)
    • 원격 객체를 대신하는 클라이언트 프록시 객체(Proxy Object)
    • 마샬링(Marshaling), 언마샬링(Unmarshaling)
    • 직렬화(Serialization), 역직렬화(Deserialization)
    • 네트워크 통신을 위한 체널(Channel)
    • 네트워크로 전송되는 데이터를 인코딩하는 포멧터(Formatter)

.NET Remoting의 구성요소

  • 서버원격 시스템의 구성
    • 원격 클래스와 원격 객체
    • 채널(Channel)
    • 포멧터(Formatter)
      • 데이터를 해석하기 편리하고 전송하기 좋은 형식으로 인코딩 또는 디코딩해야 하는데 이 역할을 담당하는 것이 포멧터이다.
  • .NET Remoting에서 제공해주는 포멧터
    • 포멧터(SoapFormatter)
      • 데이터를 XML 형식의 SOAP 방식으로 인코딩
    • Binary 포멧터(BinaryFormatter)
      • 말그대로 Binary 형식으로 인코딩하기 때문에 인코딩 속도면에서 효율적이지만, 이기종간의 통신 포멧인 SOAP을 이용하는 것이 좋다.
  • 클라이언트 원격 시스템의 구성 요소
    • 프록시 객체(Proxy Object)
      • 원격 시스템에서 클라이언트와 서버 사이를 넘나드는 참조값
    • 채널(Channel)
      • 클라이언트와 원격 서버와 통신하기 위해 존재
    • 포멧터(Formatter)
  • .NET Remoting에서 지원하는 채널의 종류
    • HTTP 채널(HttpChannel)
    • TCP 채널(TcpChannel)
원격 시스템의 구조

원격 시스템의 구조 다이어그램




.NET Remoting의 가장 간단한 예(서버)

  • 원격 서버 프로그램 작성 과정
    • 원격 클래스 작성
    • 원격 서버 프로그램 작성
    • 클라이언트 프로그램 작성
  • 원격 클래스 작성
    • 일단 클래스와 동일하지만 MarshalByRefObject 를 상속받는 것만 다르다

예제 : 원격 클래스 Server/Hello.cs

/**

서비스할 원격 클래스

**/

using System;

public class Hello : MarshalByRefObject

{

public Hello()

{

Console.WriteLine("Hello 생성자 호출");

}

public String SayHello(String name)

{

Console.WriteLine("Hello의 SayHello() 메서드 호출, 매개변수:{0}", name);

return "안녕하세요! [" + name + "] 님";

}

~Hello()

{

Console.WriteLine("Hello 소멸자 호출");

}

}

/***

c:csharpchap14ex01Server> csc /target:library /out:Hello.dll Hello.cs

***/



예제 : 리모트 서버 /Server/HelloServer.cs

/**

원격 클래스를 서비스하는 간단한 서버 프로그램

**/

using System;

using System.Runtime.Remoting;

using System.Runtime.Remoting.Channels;

using System.Runtime.Remoting.Channels.Tcp;

public class HelloServer

{

public static void Main()

{

TcpChannel channel = new TcpChannel(9009);

ChannelServices.RegisterChannel(channel, false);

RemotingConfiguration.RegisterWellKnownServiceType(

Type.GetType("Hello, Hello"),

"BaboHello",

WellKnownObjectMode.SingleCall);

System.Console.WriteLine("서버를 멈추려면 Enter를 누르세요!");

System.Console.ReadLine();

}

}

/***

c:csharpchap14ex01Server> csc /r:Hello.dll HelloServer.cs

c:csharpchap14ex01Server> HelloServer

서버를 멈추려면 Enter를 누르세요!

[참고] .NET Framework 1.0과 1.1에서는 ChannelServices.RegisterChannel(channel)과 같은 방식으로 사용하였다. 하지만 채널만을 입력받는 이 함수는 2.0에서 Obsolete되었다.

이 함수대신 ChannelServices.RegisterChannel(channel, false)와 같이 사용해야 한다. 첫번째 매개변수는 이전과 같이 채널이며 두번째 매개변수는 보안설정이 있는지 없는지를 나타낸다.

***/





예: 원격 클라이언트 Client/HelloClient.cs

/**

원격 서비스를 이용하는 간단한 클라이언트 프로그램

**/

using System;

using System.Runtime.Remoting.Channels;

using System.Runtime.Remoting.Channels.Tcp;

public class HelloClient

{

public static int Main(string[] args)

{

TcpChannel channel = new TcpChannel();

ChannelServices.RegisterChannel(channel, false);

object obj = Activator.GetObject(typeof(Hello),

"tcp://localhost:9009/BaboHello");

Hello h = (Hello)obj;

Console.WriteLine(h.SayHello("홍길동"));

return 0;

}

}

/***

1. 원격 클라이언트 실행

c:csharpchap14ex01Client> csc /r:Hello.dll HelloClient.cs

c:csharpchap14ex01Client> HelloClient

안녕하세요! [홍길동] 님

c:csharpchap14ex01Client> HelloClient

안녕하세요! [홍길동] 님

2. 원격 서버 프로그램 (클라이언트 접속후)

c:csharpchap14ex01Server> HelloServer

서버를 멈추려면 Enter를 누르세요!

Hello 생성자 호출

Hello의 SayHello() 메서드 호출, 매개변수:홍길동

Hello 생성자 호출

Hello의 SayHello() 메서드 호출, 매개변수:홍길동

3. 원격 서버 프로그램이 종료했을 때

c:csharpchap14ex01Server> HelloServer

서버를 멈추려면 Enter를 누르세요!

Hello 생성자 호출

Hello의 SayHello() 메서드 호출, 매개변수:홍길동

Hello 생성자 호출

Hello의 SayHello() 메서드 호출, 매개변수:홍길동

Hello 소멸자 호출

Hello 소멸자 호출

[참고]

클라이언트 프로그램을 컴파일하고 실행하기 위해서는 서버의 Hello.dll이 필요하다. 여기서는 여러분이 수동으로 클라이언트의 디렉토리에 복사해주어야 한다.

***/




예제를 사용하는 법 :

1. Hello 원격 클래스를 먼저 컴파일해서 dll 파일로 만든다.
2. 리모트 서비스를 작성해서 띄워놓는다.
3. 리모트 클라이언트를 띄워서 리모트 서비스측에 원격 객체가 생성되는지 확인한다.