[C#] 네이버 실시간 검색 순위 CS프로그램 - 3

개발 노트/C#  2013.08.06 09:00



안녕하세요 명월입니다.

이번 포스팅에서는 저번 포스팅에 이어서 통신 전문 클래스를 만들어 보겠습니다.

통신 전문 클래스는 우리가 Xml에서 파싱한 데이터를 Socket 전문들 보내기 위한 바이너리로 변경하는 작업입니다. Class(메모리) 자체가 통채로 전송되면 좋겠지만 아직 하드웨어적으로 그런것은 구현되지 않기때문에 메모리에 있는 값을 바이너리로 변경 작업이 필요합니다.


이 전문 클래스는 여러 비동기 통신스래드에서 공유(?)를 해야 하는 클래스 이여서 인스턴스 클래스로 작성을 하도록 하겠습니다.


그럼 소스를 확인 해 보도록 하겠습니다.



인스턴스 만드는 부분입니다.

인스턴스를 만들었으면 전문 구조체를 만들어 보도록 하겠습니다.



저번 포스팅에서도 그러했듯이 Struct 를 클래스로 구성했습니다..

4개의 항목과 Set을 하는 메소드들이 보이네요. 마지막 GetMessage는 각 데이터 들이 Set이 완료가 되면 GetMessage로 전체 전문을 뽑아내는 메소드입니다.



위에 소스는 하나의 데이터 전문을 만드는 함수라고 하면 이 소스는 전체 데이터 전문을 만드는 함수라고 보면 되겠습니다. 형태가 비슷비슷해서 같은 역할을 하는 메소드 인 것 같네요.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace RealSearchServer
{
    class SendMessageStruct
    {
        private static SendMessageStruct m_SendMessageStruct;

        public static SendMessageStruct Instance()
        {
            if (m_SendMessageStruct == null)
            {
                m_SendMessageStruct = new SendMessageStruct();
            }
            return m_SendMessageStruct;
        }
        private class MessageStruct
        {
            private byte m_Rank;
            private byte[] m_Label;
            private byte m_UpnDown;
            private byte[] m_ChangCount;

            public MessageStruct()
            {
                m_Label = new byte[1024];
            }
            public void SetRank(int nData)
            {
                m_Rank = (byte)nData;
            }
            public void SetLabel(String sData)
            {
                byte[] pBuffer = Encoding.Unicode.GetBytes(sData);
                for (int i = 0; i < 1024; i++)
                {
                    if (i < pBuffer.Length)
                    {
                        m_Label[i] = pBuffer[i];
                    }
                    else
                    {
                        m_Label[i] = 0;
                    }
                }
            }
            public void SetUpnDown(int nData)
            {
                m_UpnDown = (byte)nData;
            }
            public void SetChangeCout(int nData)
            {
                m_ChangCount = BitConverter.GetBytes(nData);
            }
            public byte[] GetMessage()
            {
                byte[] pBuffer = new byte[1030];
                pBuffer[0] = m_Rank;
                for (int i = 0; i < 1024; i++)
                {
                    pBuffer[i + 1] = m_Label[i];
                }
                pBuffer[1025] = m_UpnDown;
                for (int i = 0; i < 4; i++)
                {
                    pBuffer[1026 + i] = m_ChangCount[i];
                }
                return pBuffer;
            }
        }
        private NaverXmlReader m_Xml;
        private List m_MsgStruct;
        public SendMessageStruct()
        {
            m_MsgStruct = new List();
        }
        public void CreateMessage(NaverXmlReader Xml)
        {
            m_Xml = Xml;
            m_MsgStruct.Clear();
            for (int i = 0; i < m_Xml.Count; i++)
            {
                NaverXmlReader.DataStruct Ds =  m_Xml.GetData(i);
                MessageStruct pBuffer = new MessageStruct();
                pBuffer.SetRank(i+1);
                pBuffer.SetLabel(Ds.Label);
                switch (Ds.RankChange)
                {
                    case NaverXmlReader.DataStruct.UpnDown.UP:
                        pBuffer.SetUpnDown(1);
                        break;
                    case NaverXmlReader.DataStruct.UpnDown.Down:
                        pBuffer.SetUpnDown(-1);
                        break;
                    default:
                        pBuffer.SetUpnDown(0);
                        break;
                }
                pBuffer.SetChangeCout(Ds.ChangeSize);
                m_MsgStruct.Add(pBuffer);
            }
        }
        public byte[] GetMessage()
        {
            byte[] pSendMessage = new byte[1030 * m_MsgStruct.Count];
            for (int i = 0; i < m_MsgStruct.Count; i++)
            {
                byte[] pBuffer = m_MsgStruct[i].GetMessage();
                for (int j = 0; j < 1030; j++)
                {
                    pSendMessage[(i * 1030) + j] = pBuffer[j];
                }
            }
            return pSendMessage;
        }
    }
}


참고 소스입니다.


SendMessageStruct.cs



댓글 0개가 달렸습니다.
댓글쓰기