/// <summary>
        /// Request 된 전문에 해당하는 Response 전문 생성
        /// or
        /// 지정된 전문 생성
        ///
        /// *** 보낼 SAEA 객체에는 Request 된 전문이 들어있음
        /// </summary>
        /// <param name="sendEventArgs">보낼 SAEA 객체</param>
        /// <param name="packetName">옵션 : 특정전문 지정</param>
        /// <param name="userId">옵션 : 사용자 ID</param>
        /// <param name="message">옵션 : 메세지</param>
        /// <returns>MessageStream</returns>
        public MessageStream GetResponse(SocketAsyncEventArgs sendEventArgs, MessagePacketNameEnum packetName = MessagePacketNameEnum.EMPTY, string userId = "")
        {
            MessageStream response = null;

            try
            {
                /// Request 된 전문 (sendEventArgs) 에 해당하는 Response 전문 생성
                if (packetName == MessagePacketNameEnum.EMPTY)
                {
                    MessageReader reader = this.GetResponseHeader(sendEventArgs);
                    response = this.GetResponseMake(sendEventArgs, reader);
                }
                else
                {
                    //if (packetName == MessagePacketNameEnum.NTFTM) response = MessageNotifyTextMessage(sendEventArgs);
                    if (packetName == MessagePacketNameEnum.ACCPT)
                    {
                        response = MessageAccept();
                    }
                    else if (packetName == MessagePacketNameEnum.CLOSE)
                    {
                        response = MessageLoginDuplicated(userId);
                    }
                }
                return(response);
            }
            catch
            {
                return(null);
            }
        }
        /// <summary>
        /// 전문 바디 생성
        /// </summary>
        /// <param name="sendEventArgs">보낼 SAEA 객체</param>
        /// <param name="reader">전문 헤더</param>
        /// <param name="message">바디에 추가할 메세지</param>
        /// <returns>MessageStream</returns>
        public MessageStream GetResponseMake(SocketAsyncEventArgs sendEventArgs, MessageReader reader, string message = "")
        {
            MessageStream response = null;

            try
            {
                /// 전문 몸체 생성
                if (reader == null)
                {
                    /// 헤더 없을시 ERRHD 전문 생성
                    response = MessageErrorHeader();
                }
                else
                {
                    MessagePacketNameEnum packetName = MessagePacketNameEnum.EMPTY;

                    /// 전문 헤더의 PacketName 에 해당하는 응답전문 이름 파싱
                    if (Enum.TryParse <MessagePacketNameEnum>(reader.Header.PacketName, out packetName) == false)
                    {
                        packetName = MessagePacketNameEnum.EMPTY;
                    }

                    /// 파싱된 응답 전문 바디 생성
                    if (packetName == MessagePacketNameEnum.EMPTY)
                    {
                        response = MessageErrorHeader();
                    }
                    else if (packetName == MessagePacketNameEnum.REQVI)
                    {
                        response = MessageRequestVersionInfo(reader);
                    }
                    else if (packetName == MessagePacketNameEnum.LOGIN)
                    {
                        response = MessageLogin(reader, sendEventArgs);
                    }
                    else if (packetName == MessagePacketNameEnum.LOGOT)
                    {
                        response = MessageLogout(reader, sendEventArgs);
                    }
                    else if (packetName == MessagePacketNameEnum.ALIVE)
                    {
                        response = MessageAlive(reader);
                    }
                }
            }
            catch (Exception ex)
            {
                SocketListener.Log.ExceptionLog(ex, "전문 생성 오류");

                /// 바디 생성 오류시 MMERR 전문 생성
                response = MessageErrorMakeMessage(reader);
            }
            return(response);
        }
        /// <summary>
        /// Client 로 전문 보내기
        /// </summary>
        /// <param name="sendEventArgs">보낼 SAEA 객체</param>
        /// <param name="packetName">옵션 : 특정전문 지정</param>
        /// <param name="userId">옵션 : 사용자 ID</param>
        /// <param name="message">옵션 : 메세지</param>
        internal void SendMessageToClient(SocketAsyncEventArgs sendEventArgs, MessagePacketNameEnum packetName = MessagePacketNameEnum.EMPTY, string userId = "")
        {
            DataHoldingUserToken sendToken = (DataHoldingUserToken)sendEventArgs.UserToken;
            MessageStream        response  = null;

            /// 전문 생성
            response = messageParsing.GetResponse(sendEventArgs, packetName, userId);
            if (response == null)
            {
                return;
            }

            /// 버퍼로 복사
            int readByteAll = response.ReadAll(ref sendToken.dataToSend, this.socketListenerSettings.BufferSize);

            this.SendMessage(sendEventArgs);
        }