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

6.4.3 WebRobot 서비스 테스트 클라이언트 만들기

언제나휴일 2017. 12. 7. 10:07
반응형

6.4.3 WebRobot 서비스 테스트 클라이언트 만들기


 

 설치한 웹 로봇 서비스가 잘 동작하는지 확인하기 위해 테스트 클라이언트를 만들어 봅시다.

 

 테스트 클라이언트는 윈도우즈 폼 응용으로 만듭시다. 그리고 메인 폼에서 수집 가동을 시작하거나 멈추게 할 수 있고 수집 주기를 설정하고 Seed 사이트를 추가하는 등의 작업을 할 수 있게 컨트롤을 배치하세요.

 

[그림 6.7] 웹 수집 로봇 테스트 클라이언트 메인 폼 컨트롤 배치

[그림 6.7] 웹 수집 로봇 테스트 클라이언트 메인 폼 컨트롤 배치

 

번호

컨트롤 이름

컨트롤 유형

설명

1

btn_start_collect

Button

수집 가동 버튼

2

btn_stop_collect

Button

수집 멈춤 버튼

3

lb_period_info

Label

정보 표시

4

tbox_period

TextBox

수집 주기 입력 창

5

btn_set_period

Button

수집 주기 설정 버튼

6

btn_get_period

Button

수집 주기 가져오기 버튼

7

lb_depth_info

Label

정보 표시

8

tbox_depth

TextBox

상대적 깊이 입력 창

9

btn_set_depth

Button

상대적 깊이 설정 버튼

10

btn_get_depth

Button

상대적 깊이 가져오기 버튼

11

lb_seed_info

Label

정보 표시

12

tbox_seed

TextBox

Seed 사이트 입력 창

13

btn_seed_add

Button

Seed 사이트 입력 버튼

14

btn_get_seedtsite

Button

Seed 사이트 가져오기 버튼

15

lbox_seedsite

ListBox

Seed 사이트 목록

[ 6.3] 웹 수집 로봇 테스트 클라이언트 메인 폼 자식 컨트롤

 

 Form Load 이벤트 핸들러를 추가합니다.

private void MainForm_Load(object sender, EventArgs e)

 

 Form Load 이벤트 핸들러에서는 .NET 리모팅 서비스에 접근하기 위한 채널 생성과 등록을 합니다.

HttpChannel hc = new HttpChannel();

ChannelServices.RegisterChannel(hc, false);

 

 그리고 .NET 리모팅 서비스에서 참조한 GenericWebRobot 개체를 이용하여 수집 가동 여부를 얻어와서 가동 및 멈춤 버튼의 활성화 상태를 변경합니다. .NET 리모팅 서비스에서 참조한 GenericWebRobot 개체는 많은 곳에서 필요하므로 속성으로 정의합시다. 그리고 버튼의 활성화 상태를 변경하는 부분도 별도의 메서드로 작성합시다.

bool enable = WebRobot.GetEnabled();

SetStartStopButton(enable);

 

 WebRobot 속성에서는 .NET 리모팅 서비스에서 제공하는 GenericWebRobot 개체를 참조하여 반환합니다.

GenericWebRobot WebRobot

{

    get

    {

        GenericWebRobot robot = Activator.GetObject(

           typeof(GenericWebRobot),

           "http://[웹 수집 로봇 서비스 IP 주소]:10400/WebRobotSVC")

           as GenericWebRobot;

        return robot;

    }

}

 

 수집 가동과 멈춤 버튼의 활성화 여부는 웹 로봇의 가동 여부에 따라 설정합니다.

private void SetStartStopButton(bool enable)

{

    btn_start_collect.Enabled = !enable;

    btn_stop_collect.Enabled = enable;

}

 

 수집 가동 버튼 클릭 이벤트 핸들러를 추가하세요. 그리고 WebRobot 속성으로 참조한 개체를 통해 가동합니다. 수집 멈춤 버튼 클릭 이벤트 핸들러도 추가하여 같은 원리로 구현합니다.

private void btn_start_collect_Click(object sender, EventArgs e)

{

    WebRobot.SetEnabled(true);

    SetStartStopButton(true);

}

 

private void btn_stop_collect_Click(object sender, EventArgs e)

{

    WebRobot.SetEnabled(false);

    SetStartStopButton(false);

}

 

 수집 주기 설정 버튼 클릭 이벤트 핸들러를 추가합니다. 수집 주기 입력 창에 입력한 값을 인자로 수집 주기를 설정합니다.

private void btn_set_period_Click(object sender, EventArgs e)

{

    int period = 0;

    if (int.TryParse(tbox_period.Text, out period))

    {

        WebRobot.SetPeriod(period);

    }

}

 

 Seed 사이트 추가 버튼 클릭 이벤트 핸들러도 같은 원리로 구현합니다. 수집 주기 가져오기 버튼 클릭 이벤트 핸들러와 상대적 깊이 얻어오기 버튼 클릭 이벤트 핸들러도 같은 원리로 구현합니다.

private void btn_add_seed_Click(object sender, EventArgs e)

{

    WebRobot.SetSeedSite(tbox_seed.Text);

}

private void btn_get_period_Click(object sender, EventArgs e)

{

    tbox_period.Text =  WebRobot.GetPeriod().ToString();

}

private void btn_get_depth_Click(object sender, EventArgs e)

{

    tbox_depth.Text = WebRobot.GetDepth().ToString();

}


Seed 사이트 가져오기 버튼 클릭 이벤트 핸들러를 추가하세요. Seed 사이트를 가져오는 부분은 웹 로봇과 무관한 내용입니다. 이 부분은 DbmForAllLib에서 제공하는 것이 적절할 것입니다. 그런데 이 부분을 제공하는 부분이 없습니다. 이처럼 개발 공정에 따라 개발하다보면 앞 단계의 작업을 잘못한 것을 발견할 수 있습니다. 이 때는 발견한 문제를 해결하고 진행하세요. 여기에서는 DbmForAllLib EHDbmForAll 정정 클래스의 정적 메서드로 Seed 사이트 목록을 반환하는 GetSeedSite를 만들고 이를 이용하여 Seed 사이트 목록 상자를 설정할게요.

private void btn_get_seedsite_Click(object sender, EventArgs e)

{

    lbox_seedsite.DataSource= EHDbmForAll.GetSeedSite();

}

 

 다음은 DbmForAllLib EHDbmForAll 정정 클래스에 추가할 내용입니다.

 

 Seed 사이트 목록을 반환하는 GetSeedSite 메서드를 추가합니다.

public static List<string> GetSeedSite()

 

 결과 목록을 보관할 컬렉션을 생성합니다.

List<string> list = new List<string>();

 

 Seed 사이트 목록은 수집 후보 테이블의 항목 중에 상대적 깊이가 0인 사이트와 수집한 페이지 테이블에서 상대적 깊이가 0인 수집 요청 사이트입니다.

 

 먼저 수집 후보 테이블의 항목 중에 상대적 깊이가 0인 사이트를 얻어오기 위한 개체를 생성합니다.

SqlCommand scom = MakeSPCommand(

      "Select Url From CandidateTable Where Depth=0"

        ,CommandType.Text);

 

 SqlCommand 개체의 연결을 열고 쿼리를 실행합니다.

scom.Connection.Open();

SqlDataReader sdr = scom.ExecuteReader();

 

 SqlDataReader 개체를 순차적으로 읽어 사이트 주소를 컬렉션에 추가하고 닫습니다.

while (sdr.Read())

{

    list.Add(sdr["Url"].ToString());

}

sdr.Close();

 

 SqlCommand 개체의 연결을 닫습니다.

scom.Connection.Close();

 

 이번에는 수집한 페이지 테이블에서 상대적 깊이가 0인 요청 주소를 얻어오기 위해 개체를 만듭니다.

scom = MakeSPCommand(

        "Select OriginUrl From PostedUrlTable Where Depth=0"

        , CommandType.Text);

 

 SqlCommand 개체의 연결을 열고 명령을 실행합니다.

scom.Connection.Open();

sdr = scom.ExecuteReader();

 

 SqlDataReader 개체를 순차적으로 읽어 결과 컬렉션에 추가합니다. 요청 주소가 같은 항목이 있을 수 있으니 존재하지 않는 주소만 추가합니다.

while (sdr.Read())

{

    string url = sdr["OriginUrl"].ToString();

    if (list.Contains(url) == false)

    {

        list.Add(url);

    }

}

 

 SqlDataReader 개체와 SqlCommand 개체의 연결을 닫고 결과 목록을 반환합니다.

sdr.Close();

scom.Connection.Close();

return list;

 

EHDbmForAll.cs에 추가할 메서드 (DBMForAll 라이브러리)

/// <summary>

/// Seed 사이트 목록 가져오기 메서드

/// </summary>

/// <returns>Seed 사이트 목록</returns>

public static List<string> GetSeedSite()

{

    List<string> list = new List<string>();

 

    SqlCommand scom = MakeSPCommand(

               "Select Url From CandidateTable Where Depth=0"

                ,CommandType.Text);

 

    scom.Connection.Open();

 

    SqlDataReader sdr = scom.ExecuteReader();

    while (sdr.Read())

    {

        list.Add(sdr["Url"].ToString());

    }

    sdr.Close();

 

    scom.Connection.Close();

  

    scom = MakeSPCommand(

                "Select OriginUrl From PostedUrlTable Where Depth=0"

                , CommandType.Text);

 

    scom.Connection.Open();

 

    sdr = scom.ExecuteReader();

    while (sdr.Read())

    {

       string url = sdr["OriginUrl"].ToString();

        if (list.Contains(url) == false)

        {

            list.Add(url);

        }

    }

    sdr.Close();

 

    scom.Connection.Close();

    return list;

}

  

MainForm.cs

using System;

using System.Windows.Forms;

using System.Runtime.Remoting.Channels.Http;

using System.Runtime.Remoting.Channels;

using GenericWebRobotLib;

using DBM_ForAll;

 

namespace WebRobotSvcClient예광탄

{

    public partial class MainForm : Form

    {

        public MainForm()

        {

            InitializeComponent();

        }

 

        GenericWebRobot WebRobot

        {

            get

            {

                GenericWebRobot robot = Activator.GetObject(

               typeof(GenericWebRobot),

               "http:// [웹 수집 로봇 서비스 IP 주소]/WebRobotSVC")

                as GenericWebRobot;

                return robot;

            }

        } 

 

        private void MainForm_Load(object sender, EventArgs e)

        {

            HttpChannel hc = new HttpChannel();

            ChannelServices.RegisterChannel(hc, false);

 

            bool enable = WebRobot.GetEnabled();

            SetStartStopButton(enable);

        }

 

        private void SetStartStopButton(bool enable)

        {

            btn_start_collect.Enabled = !enable;

            btn_stop_collect.Enabled = enable;

        }

 

        private void btn_start_collect_Click(object sender, EventArgs e)

        {

            WebRobot.SetEnabled(true);

            SetStartStopButton(true);

        }

 

        private void btn_stop_collect_Click(object sender, EventArgs e)

        {

            WebRobot.SetEnabled(false);

            SetStartStopButton(false);

        }

 

        private void btn_set_period_Click(object sender, EventArgs e)

        {

            int period = 0;

            if (int.TryParse(tbox_period.Text, out period))

            {

                WebRobot.SetPeriod(period);

            }

        }

 

        private void btn_add_seed_Click(object sender, EventArgs e)

        {

            WebRobot.SetSeedSite(tbox_seed.Text);

        }

 

        private void btn_get_period_Click(object sender, EventArgs e)

        {

            tbox_period.Text =  WebRobot.GetPeriod().ToString();

        }

 

        private void btn_get_depth_Click(object sender, EventArgs e)

        {

            tbox_depth.Text = WebRobot.GetDepth().ToString();

        }

 

        private void btn_get_seedsite_Click(object sender, EventArgs e)

        {

            lbox_seedsite.DataSource = EHDbmForAll.GetSeedSite();

        }

    }

}

 

반응형