수안이의 컴퓨터 연구실

  • Mainpage
  • About Me
  • Tags
  • Metapage
  • Notice
  • Location
  • Keywords
  • Guestbook
  • Admin
  • Write an Article
  • Total | 1620929
  • Today | 309
  • Yesterday | 482

3 Articles, Search for '.NET Remoting Services'

  1. 2007/01/10 닷넷 리모팅 서비스에 대한 이해3 - 리모트객체의 종류
  2. 2007/01/10 닷넷 리모팅 서비스에 대한 이해2 (iis를 호스트로 사용)
  3. 2007/01/10 닷넷 리모팅 서비스에 대한 이해
Programming/.NET2007/01/10 17:21

닷넷 리모팅 서비스에 대한 이해3 - 리모트객체의 종류

고수닷넷 - 엠켁스님

[개요]

이전 두개의 아티클에서 호스트 방식을 달리한(사용자정의호스트,IIS) 리모팅서비스 구축을

알아 보았다.

우리는 MarshalByRefObject 상속받는 리모트 클래스를 정의하고 그 클래스의 인스턴스를

원격지 클라이언트에서 사용하는 방법을 알고 있다.


앞서 살펴본 예제에서 우리가 정의한 리모트객체는 과연 어디에서 인스터스화 되었을까?


보통 클래스를 정의하고 그 클래스의 인스턴스를 생성(new 연산자를 통한)하면

실행 컴퓨터의 특정 메모리영역에 인스턴스가 올라가게 되고 그 메모리 주소가 참조를 잃기 전까지는

계속해서 그 인스턴스를 사용할 수 있는게 일반적이다.

또한 일정시간 이상 참조를 당하지 않는 객체는 가비지콜렉트로 넘겨져 GC에 의해 불특정한 시점에

메모리에서 사라지게 된다


그러면 리모팅 환경에서는 과연 어디(서버or클라이언트)의 메모리에 실제 클래스에 대한
인스턴스가 생성되며 그 객체의 수명은 어떻게 될까?


우선, 우리는 리모트객체의 두 가지 타입에대해 알아볼 필요가 있다.

물론 임대기반수명이라는 메커니즘도 존재하지만 이번 아티클에서는
리모트 객체의 타입에 따른 리모트객체의 생명주기와 개별 클라이언트에서의 상태공유를 알아 볼 것이다.


리모트객체의 종류

리모드 객체는 크게 두가지의 종류로 나누어 진다.

Ⅰ. 서버활성화 개체(Well-Known 개체) - 서버가 활성화 한 개체

  ①SingleCall 모드

  ②Signleton 모드

Ⅱ. 클라이언트활성화 개체 - 클라이언트가 활성화 한 개체


우선, 간략히 정리하자면 서버활성화 개체는 클라이언트에서 리모트 객체의 메서드를 호출할때 활성화 되며

클라이언트 활성화 개체는 클라이언트에서 new 연산자로 리모트 객체를 생성할때 활성화 된다.


주의할 것인 위의 서버/클라이언트 활성화 라는 말은 서버/클라리이언트 메모리에 인스턴스가 생긴다는 기준이 아니라

서버/클라이언트에서 리모팅 객체를 활성화 한다는 말이다.


그럼 이제 차례대로 그 차이점을 알아보도록 하자


1. Well-Known(SingleCall) 개체에 대해서 알아보자.

  설정 파일의

  <service>

       <wellknown

           mode="SingleCall"

           type="RemotingServiceDemo.RemotingObject , RemotingObject"

           objectUri="RemotingObject" />              

  </service>

  이 부분에서 우리는 이미 개체의 종류를 명시하였다.


  -SingleCall 모드에서는 두가지를 기억 하여야 한다.

   ㉠ 클라이언트에서 리모트객체의 메서드를 호출할 때 마다 새로운 객체가 만들어 진다.

   ㉡ (데이터의)상태유지가 되지 않는다.

  - 예제를 통해 알아보자


  * RemotingObject.cs (리모트 객체)

   - 객체 생성 시점 확인을 위한 생성자와 데이터의 상태유지 확인을 위한 shareValue 라는 변수를 두었다.

  using System;

  namespace RemotingServiceDemo{

   public class RemotingObject : System.MarshalByRefObject {

     private int shareValue = 0;

     

     public RemotingObject(){

       Console.WriteLine("원격객체가 새로 생성되었습니다.");

     }      

     public int ADD(){

         return this.shareValue++;

     }

   }    

  }


  * 서버 설정파일의 service 항목 - mode 를 SingleCall로..

  <service>

       <wellknown

           mode="SingleCall"

           type="RemotingServiceDemo.RemotingObject , RemotingObject"

           objectUri="RemotingObject" />              

   </service>

  * 클라이언트 실행 파일

    - 리모트객체 생성시점과 데이터 공유 유/무를 확인하기 위해 메서드를 세번 호출한다.

   using System;

   using System.Runtime.Remoting;

   using RemotingServiceDemo;

   class SimpleClient{

       public static void Main(){

         RemotingConfiguration.Configure("Client.exe.config");      

         RemotingObject remoteObject = new RemotingObject();                        

         for(int i=0; i < 3; i++)

           Console.WriteLine(remoteObject.ADD().ToString());              

       }

    }


  * 클라이언트 설정 파일은 이전과 동일하다.


  * 실행 결과

   

사용자 삽입 이미지


  * 결론

    실행화면을 보면 클라이언트에서 리모트 객체의 메서드를 호출할때마다
    서버측 리모트객체의 생성자가 실행되며,

    각각이 별도의 객체이므로 데이터의 공유는 전혀 되고 있지 않음을 알 수 있다.

    이처럼 Well-Known 개체의 SingleCall 모드로 리모트 객체를 생성하면 데이터의 공유는 기대할수 없다.



2. Well-Known(Singleton) 개체에 대해서 알아보자.

  설정 파일의 mode 부분만 바꿔주자  

    <wellknown

      mode="Singleton"

      type="RemotingServiceDemo.RemotingObject , RemotingObject"

      objectUri="RemotingObject" />

  * 클라이언트 실행파일

   - 클라이언트에 new 연산자를 두번 사용해서 새로운 객체를 만드는것처럼 했다              

  using System;

   using System.Runtime.Remoting;

   using RemotingServiceDemo;

   class SimpleClient{

       public static void Main(){

         RemotingConfiguration.Configure("Client.exe.config");      

         RemotingObject remoteObject = new RemotingObject();                        

         for(int i=0; i < 3; i++)

           Console.WriteLine(remoteObject.ADD().ToString());  


         RemotingObject remoteObject2 = new RemotingObject();                      

         for(int i=0; i < 3; i++)

           Console.WriteLine(remoteObject2.ADD().ToString());            

       }

    }


  -Singleton 모드에서도 두가지를 기억 하여야 한다.

   ㉠ 리모트개체는 클라이언트의 첫번째 메서드 호출시 리모트 객체가 단 한번 만들어 진다

      다음번 메서드 호출부터는 같은 객체를 쓴다

   ㉡ (데이터의)상태유지가 가능하다.      


  * 실행 결과

 

사용자 삽입 이미지


  * 결론

    실행화면을 보면 리모트 객체는 클라이언트가 첫번째 메서드 호출시 단한번 생성되고

    그 이후로는 이미 생성된 객체를 사용함을 알 수 있다.

    하물며 RemotingObject remoteObject2 = new RemotingObject()                    

    이 부분에서 클라이언트가 new 연산자로 새로운 리모트 객체를 생성하는 것처럼해도

    같은 객체가 사용된다.

    이것은  Well-Known 개체는 클라이언트의 new 연산자가 아닌 메서드 호출시
    실제로 생성됨을 확연히 알 수 있는 대목이다.

    결론적으로 Well-Known 의 Singleton 모드의 리모트 개체는 클라이언트의 첫번째 메서드 호출시
    단 한번 생성되고,

    GC에 넘어가기 각 클라이언트에서는 하나의 인스턴스를 사용하는 결과를 초래한다.

    이것은 또한 각각의 클라이언트에서 데이타의 공유가 가능함을 의미하기도 한다.




3. 클라이언트 활성화 개체에 대해서 알아보자.

  - 이 개체는 우리가 일반적으로 프로그램을 짤때 클래스의 인스턴스를 생성하는 개념과 유사하다.

    즉 new 연산자를 통해서 인스턴스가 생성되고 각각의 new연산자로 생성된 인스턴스는

    서로 다른 메모리 주소를 가지는 즉 서로다른 인스턴스가 되는 것이다.  


  -Singleton 모드에서는 두가지를 기억 하여야 한다.

   ㉠ 클라이언트에서 리모트객체를 new 연산자로 생성할때 서버에서 객체가 생성된다.

   ㉡ (데이터의)상태유지 가능하다. 단, Signton과는 달리 new 연산자로 생성된 각각의 객체내에서만.

  - 예제를 통해 알아보자  


  * 서버 설정파일의 service 항목 - wellknown 를 activated 로..(종단점이 필요치 않다)

  <service>

       <activated          

           type="RemotingServiceDemo.RemotingObject , RemotingObject"

          />              

   </service>

  * 클라이언트 설정파일 - 역시 wellknown 를 activated 로..(역시 종단점이 필요치 한다)

    <client url="tcp://localhost:4989/ServerHosting">                  

       <activated

           type="RemotingServiceDemo.RemotingObject, RemotingObject"

           url="tcp://localhost:4989/ServerHosting" />      

     </client>      


  * 실행 결과

 

사용자 삽입 이미지


  * 결론

    실행화면을 보면 리모트개체는 클라이언트에서 new 연산자로 리모트개체를 생성할때
    실제로 생성됨을 알 수 있다

    두번의 new 연산자로 두개의 리모트 객체를 생성한 셈이다.

    여기서의 데이터 공유는 각 객체별로 공유가 가능하다.(일반적인 우리의 객체상식이다)



추가사항

리모트개체에 기본생성자 이외의 생성자 사용에 대해...

만일 리모트개체에 파라메타가 있는 생성자를 정의 했다고 하자.


그럼 클라이언트에서는 그 생성자를 호출 하기 위해서는 new 연산자로 파라메타를 넘겨줘야 한다.


그럼 Well-Known 과 클라이언트 활성화 개체 모두 기본생성자 이외의 생성자 사용이 가능할까??

이미 눈치를 채신분도 있으리라 본다.


답은 클라이언트 활성화 개체만 가능하다


상식적으로 생각해보자.

Well-Known 개체의 생성시점은 클라이언트의 new 연산자가 아닌 메서드 호출시 실제 리모트객체가 생성된다고 했다.

즉 파라메타가 있는 생성자에게 파라메타를 넘겨줄 방법이 없는 것이다.

그러나 클라이언트활성화타입의 개체사용시에는 new연산자로 넘겨주면 된느 것이고... (당연하죠? ^^;>


정리

이상 닷넷 리모팅서비스에서 리모트개체에 대한 타입과 그 타입에 따른 리모트개체 생성시점과

데이터 공유에 대해 알아 보았습니다.

감사합니다.
아래에는 간단히 비교한 표입니다.


Well-Known

클라이언트 활성화


SingleCall

Singleton


객체 생성시점

클라이언트이
리모트메서드
호출시 마다.

클라이언트의

첫번째 메서드

호출시 단한번.

(new 로 생성되지는 않음)

클라이언트의 new연산자

를 통한 리모트객체 생성시

마다.

데이터 상태유지

X

O

O

기본생성자 이외의
생성자 사용

X

X

O

".NET" 카테고리의 다른 글
  • Microsoft Application Blocks for .NET (0)2007/01/11
  • 가비지 수집기 기본 및 성능 힌트 (0)2007/01/11
  • 닷넷 리모팅 서비스에 대한 이해3 - 리모트객체의... (0)2007/01/10
  • 닷넷 리모팅 서비스에 대한 이해2 (iis를 호스트로... (0)2007/01/10
  • 닷넷 리모팅 서비스에 대한 이해 (0)2007/01/10
2007/01/10 17:21 2007/01/10 17:21
Posted by webdizen
Tags .NET Remoting Services
No Trackback No Comment

Trackback URL : http://www.webdizen.net/blog/trackback/2571

Leave your greetings.

[로그인][오픈아이디란?]

Programming/.NET2007/01/10 17:19

닷넷 리모팅 서비스에 대한 이해2 (iis를 호스트로 사용)

고수닷넷 - 엠켁스님

[닷넷 리모팅 - IIS를 호스트 서버로 사용하기]


개요

이전 아티클에서 사용자가 정의 호스트를 사용하는 예를 살펴 보았다.
이번에는 그 예제와 동일한 예제로 호스트 방식을 바꿔

IIS가 호스트를 하는 방식의 리모팅 서비스를 살펴 볼 것이다.

달라지는 것은 기존에 서버설정파일이 web.config 로 만들어 져야 하는 것과

종단점이 달라진다는 것이다.


구현

전반적인 설명을 이전 아티클과 동일하며 아래에는 소스코드와 변경된 부분만
간략히 소개한다.(변경된 코드는 색깔을 달리한다)


1. 리모팅 객체는 동일하다.
2. 서버설정파일을 web.config로 만든다.


<configuration>

<system.runtime.remoting>

   <application>

     <service>

       <wellknown mode="SingleCall" type="RemotingServiceDemo.RemotingObject, RemotingObject"

        objectUri="Object1.soap" />

       

       <wellknown mode="SingleCall" type="RemotingServiceDemo.RemotingObject2, RemotingObject"

        objectUri="Object2.soap" />

     </service>

   </application>

</system.runtime.remoting>

</configuration>

- 개체가 IIS(인터넷 정보 서비스)에 호스팅된 경우에는 요청이
  .NET Remoting IHttpHandler로 라우팅되도록 objectUri의 확장명은 .soap 또는 .rem이어야 합니다

- objectUri="Object1.soap" Object1.soap이 서버의 어떤 클래스와 매핑되어 있는지 정의한다


3. 리모팅객체를 컴파일한 어셈블리를 웹응용프로그램 폴더의 bin 폴더에 둔다.
   web.config 를 웹응용프로그램 폴더에 둔다
   (asp.net 와 동일합니다)

-- 서버측 호스팅 준비 끝 --


4. 클라이언트 프로그램 동일.

5. 클라이언트 설정파일

<configuration>

<system.runtime.remoting>

   <application>

     <client url="http://localhost/Remoting">

       <wellknown type="RemotingServiceDemo.RemotingObject, RemotingObject"

        url="http://localhost/Remoting/Object1.soap" />

       

       <wellknown type="RemotingServiceDemo.RemotingObject2, RemotingObject"

        url="http://localhost/Remoting/Object2.soap" />

     </client>

     <channels>

       <channel ref="http" />

     </channels>

   </application>

</system.runtime.remoting>

</configuration>


   iis 경로와 url만 맞춰 주시면 됩니다.

정리

이전 아티클의 내용중 일부 변경되 사항만을 정리 하였습니다.

이 아티클을 보신다면 이전 아티클(닷넷 리모팅 서비스에 대한 이해) 를 먼저 보고나신 후

이 아티클을 봐 주십시요..


감사합니다.

".NET" 카테고리의 다른 글
  • 가비지 수집기 기본 및 성능 힌트 (0)2007/01/11
  • 닷넷 리모팅 서비스에 대한 이해3 - 리모트객체의... (0)2007/01/10
  • 닷넷 리모팅 서비스에 대한 이해2 (iis를 호스트로... (0)2007/01/10
  • 닷넷 리모팅 서비스에 대한 이해 (0)2007/01/10
  • .NET Framework의 강력한 이름 및 보안 (0)2007/01/09
2007/01/10 17:19 2007/01/10 17:19
Posted by webdizen
Tags .NET Remoting Services
No Trackback No Comment

Trackback URL : http://www.webdizen.net/blog/trackback/2570

Leave your greetings.

[로그인][오픈아이디란?]

Programming/.NET2007/01/10 16:54

닷넷 리모팅 서비스에 대한 이해

고수닷넷 - 엠켁스

[.NET 리모팅 서비스]

개요프로젝트의 규모가 커지고 B2B와 같은 기업간 협업형태의 솔류션 개발시 분산환경에서의
개발은 더 이상 이슈화가 될 수 없을정도로 보편화 되고 있다.

초기에는 COM을 개발하고 각각의 분산서버에 물리적인 배포와 설치로 적당히(?) 해결해
왔었다. 그러나 COM의 버전변경등과 같은 이유로 재배포와 재등록의 과정에서
DLL HELL 과 같은 아주 지저분한 문제가 대두되었었다.
(이 경험이 있는 사람은 얼마나 개발자를 짜증나게 하는지 다 알고 있을 듯 싶다)
COM의 배포문제는 DLL HELL 과 같은 문제가 아니더라도 여러가지 불편한 사항들이
많이 있었다.

서버/클라이언트간의 정보교환의 중요성과 필수성이 증가하고 보다 안정적이고 쉬운배포,
생산성의 향상과 같은 요구사항을 만족시키기 위해 DCOM이나 RMI 같은 기술들이 나오게
되었다.(DCOM,RMI는 따로 설명하지 않겠습니다.)

이제는 더욱더 발전해 웹서비스라는 개념이 등장하였고 MS에서는 ASP.NET 웹서비스라는
혁신적인 기술로 개발자에게 쉬운개발,쉬운배포,이기종 플랫폼 호환을 가능케 하였다.

또한 현재 많은 중대형 프로젝트에서 도입하고 있는 닷넷의 스마트 클라이언트
환경에서의 솔루션 개발시 ASP.NET의 라운드트립(포스트백)을 사용하지 않기에
서버와 통신하는 방법으로 웹서비스와 닷넷리모팅이 사용되어지고 있다.

이번 아티클에서는 이 웹서비스와 비슷한 기능을 가진 닷넷리모팅서비스에 대해서
간략하게 알아볼 것이다.

두 서비스 모두 네트워크나 인터넷을 통해 서버/클라이언트간 정보교환을 할 수 있게 하는
서비스이지만 약간의 차이는 있다.

둘간의 차이는 깊이 들어가면 상당히 많은 부분이 있겠지만 간략하게 말을 한다면
웹서비스는 개방형 표준을 준수하여 이기종 플랫폼과 이기종 언어사이에서도 데이터교환이
가능하며,
ASP.NET 웹서비스는 ASP.NET 런타임을 요구하며 호스팅을 위해 IIS를 반드시 필요로 하는 모델인 반면,
리모팅서비스는 SOAP와 같은 표준을 반드시 준수하지는 않으며
IIS와 같은 호스팅서버에 의존적이지 않으며  닷넷환경에 보다 빠르고 유연한 데이터 송수신을 보장한다.


아래는 리모팅 서비스의 실행구조에 관한 몇가지 다이어그램이다.


사용자 삽입 이미지
 

사용자 삽입 이미지


사용자 삽입 이미지


-웹서비스와 마찬가지로 클라이언트에 프록시가 존재하여 서버와 실제 통신을 한다.
(웹서비스도 웹참조를 하면 프록시클래스가 자동으로 생긴다- Reference.cs)
-세번째 다이어그램과 같이 방화벽을 통과하기 위해서는 HTTP에 SOAP로 통신을
해야 한다. (리모팅에서의 데이터 전송 프로토콜과 포멧은 개발자가 지정 가능하다)


= 보다 이론적인 배경은 저도 다 알지를 못하기에 실제 리모팅을 개발하는 개발자

입장에서 소스코드와 함께 간략한 예제를 설명하도록 하겠습니다 =


* 리모팅 구축 순서

ASP.NET 웹서비스의 경우 IIS를 호스트로 사용하게 되어
클라이언트에서는 웹참조로 해당 IIS로 접근하여 서버측의 리소스를
호출하게 된다.
( ASP.NET웹서비스는 ASP.NET런타임을 요구한다)
그러나 닷넷 리모팅에서는 위와 같이 iis를 호스트로 사용할수도 있지만
사용자가 별도로 호스트를 만들어 서비스 할 수 있다.
즉 IIS가 없어도 리모팅 서버 구축이 가능하다는 것이다.

아래에는 리모팅 서버구축 순서를 양측면에서 비교해본 것이다.
1. IIS
를 호스트로 사용할 시
  - 서버 측 -

ⓐ 리모팅클래스(서버객체) 작성(컴파일후 웹응용프로그램폴더의 bin에 위치)

   ⓑ web.config에 리모팅객체에 대한 설정 추가
(iis로 호스팅을 하기 때문에 추가적인 채널설정(프로토콜,포트)이 불필요)

- 클라이언트 측 -

ⓐ 리모팅객체 참조를 위한 클라이언트 구성파일 작성
ⓑ 클라이언트 프로그램 작성

ⓒ 리모팅클래스 어셈블리 파일을 참조하여 클라이언트 컴파일


2. 사용자 지정 호스트를 사용할 시.
- 서버 측 -
   ⓐ 리모팅클래스(서버객체) 작성
   ⓑ 호스트프로그램(서버응용프로그램) 작성(구성파일작성)
  (iis로 호스팅할때와는 달리 직접 채널을 관리 하여햐 한다)
- 클라이언트 측 -

  ⓐ 리모팅객체 참조를 위한 클라이언트 구성파일 작성
ⓑ 클라이언트 프로그램 작성

ⓒ 리모팅클래스 어셈블리 파일을 참조하여 클라이언트 컴파일

* 호스트방식에 따른 변화는 보는 바와 같이 크지 않다.
  단지 iis호스트일 경우 http 프로토콜과 해당 웹사이트의 포트를 사용하여
호스트 를
하기에 별도의 채널 설정이 필요가 없는것뿐이다.

* 클라이언트측 ⓒ 항목을 보면 클라이언트 프로그램 컴파일시
리모팅어셈블리를 참조해서
컴파일 해야 한다고 되어있다.
즉 클라이언트에 리모팅어셈블리 파일이 있어야 한다는 것이다.
  그러나 이것은 클라이언트에서 원격객체 사용시 프록시 역할을 한다.
  실제로 호출되는 것은 서버에 있는 객체가 된다.

* 실제 작성할 리모팅 객체 및 설정파일(서버측)
아래에는 IIS를 호스트로 사용하지 않고
직접 채널을 관리하는 사용자지정 호스트를
사용한 예를 보겠다.
또한 리모팅객체를 하나의 어셈블리에 두개의 객체를 두도록 하겠다.
따라서 설정파일에서는 wellknown 요소가 두개가 되어야 한다
(이것은 선택사항입니다. 리모팅객체가 하나든 두개든 상관이 없습니다.
  단지 객체수만큼의 객제정보설정파일을 맞춰 주시면 됩니다)


-
리모팅 객체 ?

원격 클라이언트에서 호출될 객체는 System.MarshalByRefObject 로부터
상속받아야 한다.
(MarshalByRefObject는 프록시를 사용하여 메시지를 교환하는 방식으로 응용 프로그램 도 메인 경계를 넘어 통신하는 개체의 기본 클래스입니다.)

>> 아래의 파일을  csc /t:library RemotingObject.cs 로 컴파일

using System;


namespace RemotingServiceDemo{

public class RemotingObject : System.MarshalByRefObject {    

   public string RemotingMethod(){

       return "서버측 메서드 실행1";

   }

}


public class RemotingObject2 : System.MarshalByRefObject {    

   public string RemotingMethod2(){

       return "서버측 메서드 실행2";

   }

}

}



- 호스팅 프로그램(서버 프로세서) -
사용자 정의 호스팅의 호스팅을 담당할 프로세서를 직접 작성하여야 한다.
이 프로세서는 서버측 채널을 생성하고 리모팅객체를 원격서비스에 등록하며
클라이언트가 접속할수 있도록 리스팅 모드로 돌입하는 역할을 한다.
구현 방법은 두가지로 프로그래밍 방식과 구성파일을 사용하는 방식이 있다.
각각이 장단점이 있지만, 우선 구성파일을 따로 두면 채널과 리모팅 객체의 관리를
리컴파일 없이 변경 가능하다는 것이다.
(이번 아티클에서는 구성파일을 사용하는 예를 보겠습니다)

>>아래의 파일을 csc ServerHosting.cs 로 컴파일

using System;

using System.Runtime.Remoting;


namespace RemotingServiceDemo{

class ServerHosting{

   static void Main(string[] args){

     RemotingConfiguration.Configure("ServerHosting.exe.config");

     Console.WriteLine("서버프로그램 실행중..(원격객체 등록및 채널설정 완료)");

     

     Console.ReadLine();

   }

}

}


- 호스팅을 위한 서버측 구성 파일 -

<configuration>

<system.runtime.remoting>

   <application name="ServerHosting">

     <service>

       <wellknown

           mode="Singleton"

           type="RemotingServiceDemo.RemotingObject , RemotingObject"

           objectUri="RemotingObject" />

       <wellknown

           mode="Singleton"

           type="RemotingServiceDemo.RemotingObject2 , RemotingObject"

           objectUri="RemotingObject2" />

     </service>

     <channels>

       <channel ref="tcp server" port="4989" />

     </channels>

   </application>

</system.runtime.remoting>

</configuration>

* 각 요소 설명
<application name="SimpleServer"> : 서버이름 지정.
<wellknown> 요소 : 클라이언트에 노출되는 리모팅 객체 설정.
                   다수의 wellknown 요소 사용 가능.
                   mode : 참조로 마샬링되는 리모팅객체의 활성화 유형 지정.
                  type : 리모팅 객체의 타입(namespace.class)과 어셈블리명을 정의.
                   objectUri : 리모트 객체의 종단점 이름.
                   (개체가 IIS에 호스팅된 경우에는 요청이 .NET Remoting            
                    IHttpHandler로 라우팅되도록 objectUri의 확장명은 .soap    
                   또는 .rem이어야 함)
<channels> 요소 : 서버의 채널 정의.
                 하나의 <application> 요소에 하나의 <channels>만 정의 가능.
                 machine.config에 사전정의된 채널(tcp channel)을 참조(ref)하여 사용



* 실제 작성할 클라이언트측 구설파일및 코드(클라이언트측)
서버가 열어놓은 채널로 통신을 하기 위한 설정파일과 그 설정파일에
기반해서 원격객체를 사용한다


- 서버 채널접속을 위한 클라이언트 설정 파일 -
 

<configuration>

<system.runtime.remoting>

   <application name="SimpleClient">

     <client url="tcp://localhost:4989/ServerHosting">

       <wellknown

           type="RemotingServiceDemo.RemotingObject, RemotingObject"

           url="tcp://localhost:4989/ServerHosting/RemotingObject" />

       <wellknown

           type="RemotingServiceDemo.RemotingObject2, RemotingObject"

           url="tcp://localhost:4989/ServerHosting/RemotingObject2" />

     </client>

     <channels>

       <channel ref="tcp client" />

     </channels>

   </application>

</system.runtime.remoting>

</configuration>


딱히 설명할 것이 없어 보인다.
서버측 구성파일에 명시한 프로토콜과 어셈블리 경로를 맟춰주기만 하면된다.
[ url = 프로토콜://호스트이름(or IP):포트번호/서버이름/리모팅객체이름 ]

- 원격객체를 사용하는 클라이언트 코드 -

using System;

using System.Runtime.Remoting;


using RemotingServiceDemo;


class Client{

   public static void Main(){

     RemotingConfiguration.Configure("Client.exe.config");

     

     RemotingObject remoteObject = new RemotingObject();

     Console.WriteLine(remoteObject.RemotingMethod());

     

     RemotingObject2 remoteObject2 = new RemotingObject2();

     Console.WriteLine(remoteObject2.RemotingMethod2());

   }

}

 



결과 화면

사용자 삽입 이미지


참고사항위에서 클라이언트측 프로그램(Client.cs)를 컴파일 할때 리모트객체의 어셈블리를 참조하여햐
한다고 했다.
위에서도 언급했었지만 클라이언트에 참조된 어셈블리는 단지 프록시 역할을 할 뿐이다.
참조했다고 해서 그 어셈블리의 객체를 생성하는것이 아니라는 것이다.
확인 방법은
클라이언트에가 컴파일시 참조하는 RemotingObject 의 메서드안에 리턴값을 다른 글자로 변경해서
재컴파일후 Client.cs를 재컴파일된 RemotingObject.dll 을 참조해보자
이렇게...
public string RemotingMethod(){

       return "클라이언트가 바꿔버린 문자";

}
그러면 컴파일을 정상적으로 되고 실행을 해보면 여전히 서버에 있는 RemotingObject.dll이 호출될
것이다.(당연하겠지만 -.-;)
하지만 변경시 네임스페이스명,클래스명, 메서드 시그너처 같은 것은 바꾸면 Client컴파일시 에러가
난다(이것도 당연하겠죠)

정리

어디서나 구할수 있을법한 예제를 가지고 설명을 하였습니다.
하지만 중요한것은 리모팅서비스의 제대로된 이해와 그 이해를 바탕으로 한 응용이라고 봅니다.
리모팅 서비스를 구축할때 알아야 할 것은 이것이 모두가 아닙니다.
앞으로 여건이 된다면 리모팅 서비스의 다른 사항들도 확인해 보겠습니다.

감사합니다.

".NET" 카테고리의 다른 글
  • 닷넷 리모팅 서비스에 대한 이해3 - 리모트객체의... (0)2007/01/10
  • 닷넷 리모팅 서비스에 대한 이해2 (iis를 호스트로... (0)2007/01/10
  • 닷넷 리모팅 서비스에 대한 이해 (0)2007/01/10
  • .NET Framework의 강력한 이름 및 보안 (0)2007/01/09
  • 닷넷프레임 워크의 이해 (0)2006/11/24
2007/01/10 16:54 2007/01/10 16:54
Posted by webdizen
Tags .NET Remoting Services
No Trackback No Comment

Trackback URL : http://www.webdizen.net/blog/trackback/2569

Leave your greetings.

[로그인][오픈아이디란?]

«Prev  1  Next»

RSS HanRSS
Blog Image
webdizen
이 곳은 컴퓨터에 대해 연구하고, 공유하고, 소통하기 위한 연구실입니다. 개인적으로는 OLAP, Data Mining, Semantic Web, Data Modeling에 대해서 연구하고 있습니다.

Categories

전체 (2998)
Webdizen (134)
Life (6)
Diary (16)
Blog (9)
IDEA (1)
Travel (10)
Book (14)
Photo (7)
Movie (7)
Music (13)
Leisure Sports (10)
Funny (5)
Hardware (119)
Software (120)
Windows (5)
Unix & Linux (119)
Installation (4)
Kernel (10)
System (34)
Develop (22)
X-Window (0)
Applicaton (31)
Security (4)
Framework (2)
Hadoop (2)
Programming (805)
Algorithm & Data Structure (1)
Assembly (38)
UNIX/Linux C (95)
C++ (128)
STL (4)
Java (38)
Win32 API (92)
ATL/COM (44)
MFC (151)
.NET (26)
WCF/WPF (4)
C# (28)
Network Programming (17)
Database Programming (12)
OpenGL / DirectX (13)
Multimedia Programming (0)
Game Programming (21)
Parallel Distributed Progra... (0)
Reverse Engineering (0)
Debugging (9)
Python (1)
Ruby (1)
Ruby on Rails (1)
QT (4)
GTK (0)
JSP (0)
PHP (6)
ASP.NET (6)
ASP (3)
Development (28)
Useful Library (2)
Data Modeling (0)
Database (105)
Oracle (4)
MSSQL (41)
MySQL (2)
Data Warehouse (2)
Data Mining (3)
Network (66)
Web (78)
DHTML (4)
XHTML (1)
Javascript (1)
CSS (1)
AJAX (9)
XML (11)
Flex (1)
Silverlight (3)
Security (91)
DoS (1)
Kernel (10)
Scanning (3)
Sniffing (0)
Spoofing (4)
Overflow (28)
Web (11)
Shell (10)
Format String (14)
Window (2)
Embedded (70)
Multimedia (27)
Mobile (14)
Graphic (24)
Management (633)
Knowledge (581)
Hadoop (0)

Notice

  • 메타 블로그 사이트에 등록
  • 새해 맞이 블로그의 변화
  • 블로그 명칭 변경
  • 도메인(www.webdizen.net) 구...
  • TEXTCUBE 1.6.1로 업그레이드...

Tags

  • Excel
  • 행정본관
  • Computer Science
  • 시스템 제어
  • 함수 포인터
  • Calculator
  • Recovery
  • 식당동
  • Web Services
  • Direct 3D
  • 정치
  • 인덱스
  • RegOpenKey
  • WHAT-WHY-HOW
  • 게스트하우스
  • Adobe
  • ADODB
  • 빠에야
  • Visual Studio 6
  • BladeServer

Recent Articles

  • ASCII Code의 CRLF 제거 방법.
  • Hadoop 에서 c++ API 이용시....
  • Ubuntu Linux에서 Hadoop 구....
  • 내 심장을 한껏 뛰게한 "국가....
  • 스타 스키마 데이터베이스 설....

Recent Comments

  • ■ 온라인카지노 ▶ http://L....
    asdf 11/21
  • 그리고 혹시 해외여행자보험....
    kim 11/05
  • ★★실제 바다게임장과 똑같....
    asdf 11/04
  • sbsyama.co.to← 짱5000만당....
    asdf 11/04
  • ♡KicaZ??o(???) 바카라사....
    fdsf3fass 11/03

Recent Trackbacks

  • 파일 열기/저장하기 CFileDialog.
    은마군의 나태블록 02/11
  • World IT Show 2008.
    상우 :: Oranzie's BLOG 2008
  • cvs서버 설치하기.
    3인3색 2008
  • 속속 공개되는 Google Chart....
    PHP와 Web 2.0 2007
  • 마방진을 구하는 프로그램.
    Oranzie's BLOG 3 2007

Archive

  • 2009/09 (3)
  • 2009/08 (1)
  • 2009/03 (1)
  • 2009/02 (9)
  • 2009/01 (13)

Calendar

«   2009/11   »
일 월 화 수 목 금 토
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          

Bookmarks

    • Administration
      • IIS.NET
      • NTFAQ
      • OS의 모든 것
      • 리눅스포털
    • Database
      • SQL Server Central
      • SQL Team
    • Development
      • .NET Heaven
      • ASP Alliance
      • ASP.NET 2.0
      • Bullog.net
      • C# Corner
      • C++ (C PlusPlus.com)
      • C++ Reference
      • CodeGuru
      • CodePlex
      • DebugLab
      • Dev Articles
      • Devpia
      • DotNet Junkies
      • DotNet Zone
      • Driver Online
      • GOSU.NET
      • HOONS 닷넷
      • Joinc 팀블로그
      • KOSR
      • MSDN Home Page
      • OSR Online
      • Sky.ph - 개발자 커뮤니...
      • TAEYO.NET
      • The Code Project
      • WindowsClient.net
      • 김상욱의 개발자 Side
      • 조인시 위키
    • Human Networks
      • belief21c's e-space
      • I think I can
      • Invisible Rover's Blog :D
      • Rodman®
      • ■ Feel So Good~! ■
      • 까만 나비
      • 나를 가꾸는 시간.
      • 나만의 즐거움~~!
      • 단녕
      • 상우 :: Oranzie's BLOG
    • Information Technology
      • Microsoft TechNet
      • 지디넷코리아 - 글로벌...
    • Security
      • FoundStone
      • milw0rm
      • NewOrder
      • OpenRCE
      • Phrack.org
      • Reverse Engineering b1...
      • Reverse Engineering Team
      • RootKit
      • SecurityFocus
      • SecurityXploded by Nag...
      • Wow Hacker
      • Zone-H
Textcube
Louice Studio Inc.
Powered by Textcube. Original designed by Tistory.