|
.NET Remoting |
1. .NET Remoting이란? |
▶ 닷넷 환경에서의 객체기반 RPC 모델 ▶ RPC : 클라이언트가 원격지(멀리 떨어져 있는 컴퓨터)에 존재하는 함수를 호출한 후, 그 결과를 원격지로부터 받아내는 기술 ▶ 원격 서비스에 등록되어 있는 원격 클래스의 함수를 호출하기 위한 아키텍쳐를 의미
☞ 원격(Remote) : 현재 컴퓨터에 존재하지 않고 다른 컴퓨터에 존재한다는 의미이다.
|
2. 리모팅(Rmoting) |
▶ 서비스 개념을 포함 ▶ 원격 서버가 클라이언트에게 서비스(Service)를 제공 → 원격서버(Remote Server)에는 원격 객체(Remote Object)가 존재하고 클아이언트 가 원격 객체의 함수를 호출했을 때 원격 서버의 자원을 이용하여 함수를 처리한 후 그 결과만 클아이언트가 받는것이다.
|
3. .NET Remoting의 구성요소 ( 서버 원격 시스템의 구성) |
▶ 원격 클래스(Rmote Class)와 원격 객체(Remote Object) ▶ 채널(Channel) : 클라이언트와 통신을 하기 위한 서버 채널 ▶ 포멧터(Formatter) : 인코딩 담당
|
4. .NET Remoting의 구성요소 ( 클라이언트 원격 시스템의 구성) |
▶ 프록시 객체(Proxy Object) ▶ 채널(Channel) : 원격 서버와 통신을 하기 위한 서버 채널 ▶ 포멧터(Formatter) : 인코딩 담당
☞ 프록시(Proxy) : 클라이언트에 존재하는 원격 참조값
|
5. 포멧터(Formatter)의 종류 |
채널로 전송되는 데이터는 해석하기 편리하고 전송하기 좋은 형식으로 인코딩 또는 디코딩 한다. 포멧터는 인코더와 디코더의 역할을 담당한다. ▶ Soap 포멧터(SoapFormatter) : 데이터를 XML 형식의 SOAP 방식으로 인코딩 ▶ Binary 포멧터(BinaryFormatter) : 데이터를 바이너리 형태로 인코딩 |
Soap 포멧터로 인코딩하는 것보다 Binary 포멧터를 이용한 인코딩이 속도면에서 효율적이지만, 이기종간의 통신 포멧인 SOAP 프로토콜을 이용하는 Soap 포멧터는 상호 운용성이 중요시 되는 곳에 사용된다. |
6. 채널(Channel)의 종류 |
▶ HTTP 채널 : HTTP 프로토콜을 이용, 디폴트로 Soap 포멧터 이용 ▶ TCP 채널 : TCP 프로토콜 이용하여 통신, Binary 포멧터 이용 |
Remoting 실습 |
1. 일반 어셈블리 만들기 (SimpleRemotingAsm.dll) |
namespace SimpleRemotingAsm { public class RemoteMessageObject:MarshalByRefObject { public RemoteMessageObject() { Console.WriteLine("생성자!"); } public void DisplayMessage(string msg) { Console.WriteLine("Message is : {0}", msg); } public string ReturnMessage() { return "Hello from the server!"; } } }
|
System.MarshalByRefObject 기본 클래스로부터 파생되었기 때문에 클라이언트 측 프록시를 통해 접근될 수 있다.
|
클래스 라이브러리로 프로젝트를 만들고 소스를 컴파일시키면 bin → Debug폴더 안에SimpleRemotingAsm.dll이 만들어진다.
|
2. 서버 어셈블리 만들기 (SimpleRemoteObjectServer.exe) |
System.Runtime.Remoting.dll 과 SimpleRemotingAsm.dll을 참조추가한다
|
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Http; using SimpleRemotingAsm;
namespace SimpleRemoteObjectServer { class SimpleObjServer { static void Main(string[] args) { Console.WriteLine("**Server Start"); Console.WriteLine("Hit enter to end"); //새로운 HttpChannel을 등록한다. HttpChannel c = new HttpChannel(32469); ChannelServices.RegisterChannel(c); //싱글톤 활성화를 이용해서 WKO 형식을 등록한다. RemotingConfiguration.RegisterWellKnownServiceType(typeof(SimpleRemotingAsm.RemoteMessageObject), "RemoteMsgObj.soap", WellKnownObjectMode.Singleton); Console.ReadLine(); } } }
|
Main()은 처음에 임의의 포트 ID를 이용해 새로운 HttpChannel 형식을 만들면서 시작된다. 이 포트는 정적 메소드인 ChannelServices.RegisterChannel()을 통해 채널을 등록할 때 열린다. 채널이 등록되면, 원격 서버 어셈블리가 포트 번호 32469를 통해 입력 메시지를 처리할 준비를 갖추게 된다. SimpleRemotingAsm.RemoteMessageObject 형식을 WKO로 등록하기 위해 RemotingConfiguration.RegisterWellKnownServiceType() 메소드를 이용한다. 여기에서 CLR에게 이 객체가 RemoteMsgObj.soap이라는 이름의 WKO 형식으로 구현된다는 것을 알리게 된다. 정적 메소드인 RemotingConfiguration.RegisterWellKnownServiceType()의 두번째 매개변수는 응용 프로그램 도메인 경계 사이에서 이 객체를 식별하는데 사용하게 될 문자열이다. 싱글톤 WKO 형식으로 구성했으므로, RemoteMessageObject의 인스턴스 하나가 모든 입력 요청을 서비스하게 된다. |
3. 클라이언트 어셈블리 만들기 (SimpleRemoteObjectClient.exe) |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Http; using SimpleRemotingAsm;
namespace SimpleRemeteObjectClient { class SimpleObjClient { static void Main(string[] args) { Console.WriteLine("*** SimpleRemoteObjectClinet started! ***"); Console.WriteLine("Hit enter to end"); //새로운 HttpChannel을 생성한다. HttpChannel c = new HttpChannel(); ChannelServices.RegisterChannel(c); //원격 WKO 형식에 대한 프록시를 가져온다. object remoteObj = Activator.GetObject(typeof(SimpleRemotingAsm.RemoteMessageObject), "http://localhost:32469/RemoteMsgObj.soap"); //원격 객체를 사용한다. RemoteMessageObject simple = (RemoteMessageObject)remoteObj; simple.DisplayMessage("Hello from the client!"); Console.WriteLine("Server says:{0}", simple.ReturnMessage()); Console.ReadLine();
} } }
|
HTTP 채널을 등록한다. 클라이언트는 .NET Remoting 계층에 동적으로 할당되므로 포트 ID를 명시할 필요가 없다. 이 클라이언트가 등록된 WKO 형식과 상호작용하기 때문에 이 형식의 기본 생성자를 트리거링할 수밖에 없다. 그러기 위해서 Activator.GetObject() 메소드를 이용해 두개의 매개변수를 지정한다. 첫번째는 상호작용하려고 하는 원격 객체를 설명하는 형식 정보이다. Activator.GetObject() 메소드에는 객체의 메타데이터 정보가 필요하기 때문에 클라이언트에도 일반 어셈블리에 대한 참조가 필요하다! |
실행결과 (서버실행후 클라이언트 실행) |
<서버 실행화면>
<클라이언트 실행화면>
|
참고문헌
소설같은 C#
C#과 닷넷플랫폼