.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 방식으로 인코딩
- 데이터를 XML 형식의 SOAP 방식으로 인코딩
- Binary 포멧터(BinaryFormatter)
- 말그대로 Binary 형식으로 인코딩하기 때문에 인코딩 속도면에서 효율적이지만, 이기종간의 통신 포멧인 SOAP을 이용하는 것이 좋다.
- 말그대로 Binary 형식으로 인코딩하기 때문에 인코딩 속도면에서 효율적이지만, 이기종간의 통신 포멧인 SOAP을 이용하는 것이 좋다.
- 포멧터(SoapFormatter)
- 클라이언트 원격 시스템의 구성 요소
- 프록시 객체(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. 리모트 클라이언트를 띄워서 리모트 서비스측에 원격 객체가 생성되는지 확인한다.