6.4.3 WebRobot 서비스 테스트 클라이언트 만들기
설치한 웹 로봇 서비스가 잘 동작하는지 확인하기 위해 테스트 클라이언트를 만들어 봅시다.
테스트 클라이언트는 윈도우즈 폼 응용으로 만듭시다. 그리고 메인 폼에서 수집 가동을 시작하거나 멈추게 할 수 있고 수집 주기를 설정하고 Seed 사이트를 추가하는 등의 작업을 할 수 있게 컨트롤을 배치하세요.
[그림 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(); } } } |
'프로그래밍 기술 > 웹 검색 엔진 만들기' 카테고리의 다른 글
10. 검색 서비스 만들기 (0) | 2017.12.07 |
---|---|
9. 2 랭커 라이브러리 만들기 (0) | 2017.12.07 |
9. 랭커 만들기 (0) | 2017.12.07 |
8. 역 파일 생성기 만들기 (0) | 2017.12.07 |
7. 형태소 분석기 만들기 (0) | 2017.12.07 |
6.4.2 WebRobot 서비스 만들기 (0) | 2017.12.07 |
6. 4 웹 로봇 서비스 만들기 (0) | 2017.12.07 |
6. 3 웹 로봇 예광탄 구현 (0) | 2017.12.07 |
6.2.5 WebPostedEventArgs 구현 (0) | 2017.12.07 |
6.2.4 RawPostedPage 구현 (0) | 2017.12.07 |