원격 제어 프로그램 11. 원격 제어 이벤트 수신 버퍼 분석

메시지를 수신하는 서버에서는 수신한 버퍼의 내용을 분석하는 부분이 필요합니다. 여기에서는 Meta 클래스를 정의하여 분석한 정보를 표현합시다.

public class Meta
{

수신한 메시지 종류를 속성으로 제공합시다.

    public MsgType Mt
    {
        get;
        private set;
    }

누르거나 뗀 키를 속성으로 제공합시다.

    public int Key
    {
        get;
        private set;
    }

마우스 좌표를 속성으로 제공합시다.

    public Point Now
    {
        get;
        private set;
    }

생성자는 수신한 버퍼를 입력 인자로 받습니다.

    public Meta(byte[] data)
    {

메시지 종류를 설정하세요.

        Mt = (MsgType)data[0];//메시지 종류 설정

메시지 종류에 따라 수신한 버퍼를 변환합니다. 키를 누르거나 뗀 이벤트일 때는 수신한 버퍼의 내용을 키로 변환하고 마우스 이동 이벤트일 때는 좌표로 변환하세요.

        switch (Mt)//메시지 종류에 따라
        {
            case MsgType.MT_KDOWN:
            case MsgType.MT_KEYUP:   MakingKey(data); break;//데이터를 키로 변환
            case MsgType.MT_M_MOVE: MakingPoint(data); break;//데이터를 좌표로 변환
        }
    }

마우스 이동 이벤트일 때 좌표로 변환하는 MakingPoint 메서드를 정의합시다.

    private void MakingPoint(byte[] data)
    {

data를 좌표로 변환하세요.

        //data를 좌표로 변환
        Point now = new Point(0, 0);

인덱스 1~4까지 4바이트는 x좌표, 5~8까지 4바이트에는 y 좌표값으로 변환합니다.

        now.X = (data[4] << 24) + (data[3] << 16) + (data[2] << 8) + (data[1]);
        now.Y = (data[8] << 24) + (data[7] << 16) + (data[6] << 8) + (data[5]);
        Now = now;
    }

수신한 데이터를 키로 변환하는 MakingKey 메서드를 정의하세요.

    private void MakingKey(byte[] data)
    {

data를 키로 변환하세요.

        //data를 키로 변환
        Key = (data[4] << 24) + (data[3] << 16) + (data[2] << 8) + (data[1]);
    }
}

다음은 이번 실습에서 작성한 소스 코드입니다.

//Meta.cs

using System.Drawing;

namespace 원격제어기
{
    /// <summary>
    /// 원격 제어 이벤트 수신 정보를 변환한 클래스
    /// </summary>
    public class Meta
    {
        /// <summary>
        /// 원격 제어 이벤트 종류 - 가져오기
        /// </summary>
        public MsgType Mt
        {
            get;
            private set;
        }

        /// <summary>
        /// 누르거나 뗀 키 - 가져오기
        /// </summary>
        public int Key
        {
            get;
            private set;
        }

        /// <summary>
        /// 마우스 좌표 - 가져오기
        /// </summary>
        public Point Now
        {
            get;
            private set;
        }

        /// <summary>
        /// 생성자
        /// </summary>
        /// <param name="data">수신한 원격 제어 이벤트 </param>
        public Meta(byte[] data)
        {
            Mt = (MsgType)data[0];//메시지 종류 설정

            switch (Mt)//메시지 종류에 따라
            {
                case MsgType.MT_KDOWN:
                case MsgType.MT_KEYUP:
                    MakingKey(data); break;//데이터를 키로 변환
                case MsgType.MT_M_MOVE:
                    MakingPoint(data); break;//데이터를 좌표로 변환
            }
        }

        private void MakingPoint(byte[] data)
        {
            //data를 좌표로 변환
            Point now = new Point(0, 0);
            now.X = (data[4] << 24) + (data[3] << 16) + (data[2] << 8) + (data[1]);
            now.Y = (data[8] << 24) + (data[7] << 16) + (data[6] << 8) + (data[5]);
            Now = now;
        }

        private void MakingKey(byte[] data)
        {
            //data를 키로 변환
            Key = (data[4] << 24) + (data[3] << 16) + (data[2] << 8) + (data[1]);
        }
    }
}