라. 원격 제어 컨트롤러

이번에는 원격 제어하는 컨트롤러를 만들어 봅시다.

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