이번에는 원격 제어하는 컨트롤러를 만들어 봅시다.
public class Controller {
원격 제어 컨트롤러는 단일체 패턴으로 정의할 것입니다. 이를 위해 정적 개체를 위한 정적 멤버 필드를 선언하세요.
static Controller singleton;
단일체 개체를 참조할 수 있는 정적 속성을 제공합니다.
public static Controller Singleton { get{ return singleton; } }
정적 생성자에서 단일체를 생성합니다.
static Controller() { singleton = new Controller(); }
그리고 기본 생성자는 private으로 접근 설정하여 다른 곳에서 개체를 생성할 수 없게 합니다.
private Controller() { }
이미지는 수신하므로 ImageServer 개체를 위한 멤버를 선언하세요.
ImageServer img_sever = null;
키보드와 마우스 이벤트는 전송하므로 SendEventClient 개체를 위한 멤버를 선언하세요.
SendEventClient sce = null;
이미지를 수신하였을 때 처리를 위한 이벤트를 멤버로 선언합시다.
public event RecvImageEventHandler RecvedImage = null;
상대측 IP를 기억하는 멤버를 선언합시다.
string host_ip;
SendEventClient 개체를 가져오기 할 수 있는 속성을 제공합니다.
public SendEventClient SendEventClient { get{ return sce; } }
자신의 IP 주소를 구하는 속성을 제공합시다.
public string MyIP { get {
먼저 호스트 이름을 얻어오고 호스트 목록 개체를 구합니다.
string host_name = Dns.GetHostName(); IPHostEntry host_entry = Dns.GetHostEntry(host_name);
호스트 목록 개체의 주소 목록의 각 개체를 조사하여 주소 패밀리가 IPv4인 것을 찾습니다.
foreach (IPAddress ipaddr in host_entry.AddressList) { if(ipaddr.AddressFamily==AddressFamily.InterNetwork){ return ipaddr.ToString(); } }
없으면 빈 문자열을 반환합니다.
return string.Empty; } }
원격 제어 컨트롤로를 가동하는 메서드를 제공합시다.
public void Start(string host_ip) {
입력 인자로 받은 상대측 IP를 멤버에 설정합니다.
this.host_ip = host_ip;
이미지 서버를 가동합니다. 여기에서는 20004 포트로 하드 코딩할게요.
img_sever = new ImageServer(MyIP, 20004);
이미지를 수신하였을 때 처리할 이벤트 핸들러를 등록합니다.
img_sever.RecvedImage += new RecvImageEventHandler(img_sever_RecvedImage);
SetupClient를 설정합니다. 여기에서도 포트 번호는 20002로 하드 코딩할게요.
SetupClient.Setup(host_ip, 20002); }
void img_sever_RecvedImage(object sender, RecvImageEventArgs e) {
이미지를 수신한 이벤트는 구독자에게 By Pass 합니다.
if (RecvedImage != null) { RecvedImage(this, e); } }
이벤트 전송 클라이언트를 설정하는 메서드를 추가합니다.
public void StartEventClient() {
SendEventClient 개체를 생성합니다. 포트 번호는 20010으로 하드 코딩할게요.
sce = new SendEventClient(host_ip, 20010); }
서버의 가동을 멈추는 메서드를 제공합니다.
public void Stop() { if (img_sever != null) {
이미지 서버의 Close 메서드를 호출하여 해제화합니다.
img_sever.Close();
그리고 img_server를 null로 설정합니다.
img_sever = null; } } }
using System.Net; using System.Net.Sockets; namespace 원격제어기 { public class Controller { static Controller singleton; public static Controller Singleton { get{ return singleton; } } static Controller(){ singleton = new Controller(); } private Controller(){ } ImageServer img_sever = null; SendEventClient sce = null; public event RecvImageEventHandler RecvedImage = null; string host_ip; public SendEventClient SendEventClient { get{ return sce; } } public string MyIP { get { string host_name = Dns.GetHostName(); IPHostEntry host_entry = Dns.GetHostEntry(host_name); foreach (IPAddress ipaddr in host_entry.AddressList) { if (ipaddr.AddressFamily == AddressFamily.InterNetwork) { return ipaddr.ToString(); } } return string.Empty; } } public void Start(string host_ip) { this.host_ip = host_ip; img_sever = new ImageServer(MyIP, 20004); img_sever.RecvedImage += new RecvImageEventHandler(img_sever_RecvedImage); SetupClient.Setup(host_ip, 20002); } void img_sever_RecvedImage(object sender, RecvImageEventArgs e) { if (RecvedImage != null) { RecvedImage(this, e); } } public void StartEventClient() { sce = new SendEventClient(host_ip, 20010); } public void Stop() { if (img_sever != null) { img_sever.Close(); img_sever = null; } } } }
[소스 9.11] Controller.cs