프로그래밍 기술/웹 검색 엔진 만들기

1. 7 .NET 리모팅

언제나휴일 2017. 12. 5. 14:24
반응형

1. 7 .NET 리모팅


 

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

 

 .NET 리모팅 서비스를 위해서는 서비스를 제공하는 서버와 서비스를 제공받는 클라이언트가 필요하며 서버 측에서 클라이언트에 제공하는 개체를 정의한 클래스 라이브러리가 필요합니다.

 

 서버 측에서 클라이언트에 제공하는 개체는 MashalByReference에서 파생한 개체로 원격 개체라고 말합니다.

 

 서버 측에서는 채널을 등록하여 원격 개체를 사용할 수 있게 등록합니다. 클라이언트 측에서는 서버 측 채널에 접근하여 원격 개체를 참조하여 사용하는데 클라이언트 측에서 원격 개체를 참조하여 사용할 수 있는 개체를 Proxy 개체라 부릅니다.

 

 클라이언트 측에서 Proxy 개체를 통해 메서드를 호출하면 포멧터를 통해 메서드 이름과 인자 등을 Masharing하여 서버 측에 전달하면 서버 측의 Stub에서 이를 수신하여 실제 개체인 원격 개체를 제어합니다. 그리고 결과를 같은 방법으로 서버 측의 Stub에서 클라이언트 측의 Proxy 개체에게 전송하고 Proxy개체는 수신한 정보로 결과를 반환하는 원리입니다.

 

[그림 1.26] .NET 리모팅 구조

[그림 1.26] .NET 리모팅 구조

 간단하게 .NET 리모팅 서비스를 구축하고 이를 사용하는 클라이언트를 구현해 봅시다.

 

 여기에서 실습할 내용은 0~9 사이의 숫자를 입력받으면 이를 "one"~"nine"으로 변환하는 서비스를 제공하는 것으로 할게요.

 

1.7.1 공통 라이브러리 제작

 

 먼저 클래스 라이브러리 형태의 프로젝트를 생성합니다. 그리고 기본으로 제공하는 소스 파일명을 NumToEng.cs로 변경하세요.

 

 .NET 리모팅으로 클라이언트에서 참조하여 사용하기 위해서는 MashalByRefObject를 기반으로 파생 클래스를 정의해야 합니다.

public class NumToEng:MarshalByRefObject

{

}

 

 변환에서 반환할 문자열을 담을 배열을 선언 및 초기화합시다.

string[] warr = new string[]

{  "zero","one","two","three","four","five","six","seven","eight","nine"  };

 

 그리고 0~9 사이의 정수를 입력받아 영어로 변환한 문자열을 반환하는 메서드를 추가합시다. 동작 흐름을 파악하기 위해 의도적으로 콘솔에 출력하는 구문을 넣었습니다.

public string Convert(int num)

{

    Console.WriteLine("NumToEng 개체의 Convert 메서드 :{0} 받음", num);

    if ((num >= 0) && (num <= 9))

    {

        return warr[num];

    }

    return "none";

}

 

NumToEng.cs

using System;

 

namespace NumToEngLib

{

    /// <summary>

    /// 변환기(0~9 사이의 정수를 영어로)

    /// </summary>

    public class NumToEng:MarshalByRefObject

    {

        string[] warr = new string[]

        {

            "zero","one","two","three","four","five","six","seven","eight","nine"

        };

        /// <summary>

        /// 변환 메서드

        /// </summary>

        /// <param name="num">0~9 사이의 정수</param>

        /// <returns>변환한 문자열</returns>

        public string Convert(int num)

        {

            Console.WriteLine("NumToEng 개체의 Convert 메서드 :{0} 받음", num);

            if ((num >= 0) && (num <= 9))

            {

                return warr[num];

            }

            return "none";

        }

    }

}

 

 

1.7.2 서버 예광탄 제작

 

 그리고 서버를 구축하기 위해 콘솔 응용 프로그램 형태의 서버 예광탄 프로젝트를 추가하세요. 여기에서는 .NET 리모팅을 소개하는 것을 목적으로 콘솔 응용 프로그램 형태로 제작할게요.

 

 .NET 리모팅 서버를 구축하려면 System.Runtime.Remoting 어셈블리를 참조 추가해야 합니다. 그리고 앞에서 만든 NumToEngLib를 참조 추가하세요.

 

 서버 측에서는 클라이언트에서 연결할 수 있는 채널을 등록합니다. TCP 채널과 HTTP 채널을 사용할 수 있는데 여기에서는 방화벽에 친숙한 HTTP 채널을 생성하여 등록할게요.

HttpChannel hc = new HttpChannel(16000);

ChannelServices.RegisterChannel(hc, false);

 

 그리고 클라이언트에서 원격으로 참조할 수 있는 개체 형식을 등록합니다. 등록할 수 있는 서비스 종류는 여러 가지가 있는데 여기에서는 서버 측 활성화 개체로 단일개체 모드로 등록할게요.

RemotingConfiguration.RegisterWellKnownServiceType(

           typeof(NumToEng),

            "MySvc",

            WellKnownObjectMode.Singleton

            );

 

 프로세스가 키를 누를 때까지 종료하지 않고 대기할 수 있게 합시다.

Console.ReadKey();

 

 

Program.cs

using System;

using System.Runtime.Remoting.Channels.Http;

using System.Runtime.Remoting.Channels;

using System.Runtime.Remoting;

using NumToEngLib;

 

namespace 서버_예광탄

{

    class Program

    {

        static void Main(string[] args)

        {

            HttpChannel hc = new HttpChannel(16000);

            ChannelServices.RegisterChannel(hc, false);

 

            RemotingConfiguration.RegisterWellKnownServiceType(

                typeof(NumToEng),

                "MySvc",

                WellKnownObjectMode.Singleton

                );

 

            Console.ReadKey();

        }

    }

}

 

 

 

1.7.3 클라이언트 제작

 

 .NET 리모팅 서비스를 사용하는 클라이언트를 만듭시다. 클라이언트는 Windows Forms 형태의 응용 프로그램을 작성합시다.

 

[그림 1.27] 클라이언트 메인 폼 컨트롤 배치

[그림 1.27] 클라이언트 메인 폼 컨트롤 배치

 

번호

컨트롤 이름

컨트롤 유형

설명

1

nud

NumericUpDown

정수 선택

2

btn_convert

Button

변환 명령

3

lb_digit

Label

정수를 변환한 문자열

[ 1.5] 클라이언트 메인 폼의 자식 컨트롤

 

 .NET 리모팅 서비스를 사용하는 클라이언트도 System.Runtime.Remoting 어셈블리와 공용 라이브러리인 NumToEngLib 어셈블리를 참조 추가해야 합니다.

 

 메인 폼의 Load 이벤트 핸들러를 추가하여 채널 생성 및 등록합니다.

private void MainForm_Load(object sender, EventArgs e)

{

    HttpChannel hc = new HttpChannel();

    ChannelServices.RegisterChannel(hc, false);

}

 

 

 

 변환 버튼의 Click 이벤트 핸들러를 추가합니다.

private void btn_convert_Click(object sender, EventArgs e)

 

 이벤트 핸들러에서는 원격 서버로부터 원격 개체를 참조합니다. 이 때 Activator 클래스의 정적 메서드 GetObject를 이용합니다. 클라이언트 측에서 참조한 개체는 실제 개체가 아닌 원격 개체의 Proxy 개체입니다.

NumToEng nte = Activator.GetObject(

        typeof(NumToEng),

        "http://[서버 IP]:16000/MySvc")

        as NumToEng;

 

 그리고 원격 개체를 참조한 nte Convert 메서드를 호출하여 결과를 레이블의 Text 속성을 지정합니다.

lb_digit.Text = nte.Convert((int)nud.Value);

 

 이제 빌드한 후에 서버를 실행하고 클라이언트를 실행하여 테스트 하면 다음과 같이 동작함을 알 수 있습니다.

 

[그림 1.28] 시연 화면

[그림 1.28] 시연 화면

 

 시연 화면을 보면 알 수 있듯이 서버 측의 원격 개체의 Convert 메서드가 동작함을 알 수 있습니다.

 

 

MainForm.cs

using System;

using System.Windows.Forms;

using System.Runtime.Remoting.Channels.Http;

using System.Runtime.Remoting.Channels;

using NumToEngLib;

 

namespace 클라이언트_예광탄

{

    public partial class MainForm : Form

    {

        public MainForm()

        {

            InitializeComponent();

        }

        private void btn_convert_Click(object sender, EventArgs e)

        {

            NumToEng nte = Activator.GetObject(

                typeof(NumToEng),

                "http:// [서버 IP]:16000/MySvc")

                as NumToEng;

            lb_digit.Text = nte.Convert((int)nud.Value);

        }

        private void MainForm_Load(object sender, EventArgs e)

        {

            HttpChannel hc = new HttpChannel();

            ChannelServices.RegisterChannel(hc, false);

        }

    }

}

 

반응형

'프로그래밍 기술 > 웹 검색 엔진 만들기' 카테고리의 다른 글

3. 3 DB 설계  (0) 2017.12.06
3. 2 시퀀스 다이어그램  (0) 2017.12.05
3. 1 컴포넌트 다이어그램  (0) 2017.12.05
3. 아키텍쳐링  (0) 2017.12.05
2. 요구 분석 및 정의  (0) 2017.12.05
1.6.2 사용자 정의 컨트롤 만들기  (0) 2017.12.05
1.6.1 간단한 Windows Forms 응용 만들기  (0) 2017.12.05
1. 6 Windows Form  (0) 2017.12.05
1.5 라이브러리  (0) 2017.12.01
1. 5 라이브러리  (0) 2017.11.09