private bool isSuccess(KeywordMessageType msgType, string passpart, string mac, out string errorInfo)
        {
            errorInfo = "";
            if (msgType == KeywordMessageType.User)
            {
                if (string.Compare(passpart, Service.UserLoginPassword) == 0)
                {
                    Service.SetMac(mac);
                    return(true);
                }
                else
                {
                    errorInfo = "密码输入错误";
                    return(false);
                }
            }
            else
            {
                string val = "";
                bool   b   = Service.dic.TryGetValue(mac, out val);
                if (b && string.Compare(val, passpart) == 0)
                {
                    return(true);
                }

                errorInfo = "用户验证错误";
                return(false);
            }
        }
        /// <summary>
        /// 解析消息包
        /// </summary>
        /// <param name="stream"></param>
        private void AnalyzeMessageBag(NetworkStream stream, MessageBag bag)
        {
            KeywordMessageType type = (KeywordMessageType)bag.Head.Type;

            switch (type)
            {
            case KeywordMessageType.None:
                break;

            case KeywordMessageType.User:
            {
                byte[] body = bag.BytesBody;
                UserCheck(stream, body, KeywordMessageType.User);
                break;
            }

            case KeywordMessageType.Upload:
            {
                int state = bag.Head.State;
                if (state == 1)
                {
                    //首次上传校验信息
                    byte[] body = bag.BytesBody;
                    string val  = UserCheck(stream, body, KeywordMessageType.Upload);

                    //引处校验成功后,将等着接收更新字符串
                    if (!string.IsNullOrEmpty(val) && val == "sameversion")
                    {
                        MessageBag recBag = ReceiveMessageBag(stream);

                        AnalyzeMessageBag(stream, recBag);
                    }
                }
                else
                {
                    //二次传入更新信息
                    byte[] body      = bag.BytesBody;
                    string updateStr = Encoding.UTF8.GetString(body);

                    //更新本地词库
                    UpdateServerDict(updateStr);

                    //更改服务器版本号,并保存新增文件
                    string versionR = GetIncVersion();
                    Service.DictVersion = versionR;

                    string fileName = versionR;         //不加扩展名
                    SaveFile(fileName, updateStr);

                    //返回"版本号与更新字符串"
                    MessageHead head       = new MessageHead((int)KeywordMessageType.Upload, 0, 2);
                    string      updateCmd  = GetUpdateCmd();
                    byte[]      updateBody = GetBodyBytes(Service.DictVersion, updateCmd);
                    MessageBag  returnBag  = new MessageBag(head, updateBody);
                    SendMessageBag(stream, returnBag);
                }
                break;
            }

            case KeywordMessageType.Update:
            {
                byte[] body = bag.BytesBody;
                UserCheck(stream, body, KeywordMessageType.Update);
                break;
            }

            default:
                break;
            }
        }
        /// <summary>
        /// 用户验证
        /// </summary>
        /// <param name="body"></param>
        private string UserCheck(NetworkStream stream, byte[] body, KeywordMessageType msgType)
        {
            string resultVal = "";
            string all       = Encoding.UTF8.GetString(body);

            string[] arrstr = all.Split(new[] { '&' }, StringSplitOptions.None);
            passpart = arrstr[0];
            version  = arrstr[1];
            mac      = arrstr[2];

            int cmd = 0;

            //验证密码是否正确 //成功,为真;失败为假
            string errorInfo = "";
            bool   value     = isSuccess(msgType, passpart, mac, out errorInfo);

            if (!value)
            {
                MessageHead head = new MessageHead((int)msgType, 0, 0);
                byte[]      info = Encoding.UTF8.GetBytes(errorInfo);
                MessageBag  bag  = new MessageBag(head, info);

                SendMessageBag(stream, bag);
                resultVal = "";
            }
            else
            {
                string newId = Service.GetSessionId();
                Service.SetSessionId(mac, newId);

                //验证版本号
                if (string.Compare(version, Service.DictVersion) == 0)
                {
                    if (msgType == KeywordMessageType.Upload)
                    {
                        cmd = 1;
                    }
                    MessageHead head = new MessageHead((int)msgType, cmd, 1);

                    byte[]     idBody = Encoding.UTF8.GetBytes(newId);
                    MessageBag bag    = new MessageBag(head, idBody);

                    SendMessageBag(stream, bag);
                    resultVal = "sameversion";
                }
                else
                {
                    if (msgType == KeywordMessageType.Upload)
                    {
                        cmd = 2;
                    }

                    MessageHead head = new MessageHead((int)msgType, cmd, 2);

                    string     updateCmd  = GetUpdateCmd();
                    byte[]     updateBody = GetBodyBytes(newId, Service.DictVersion, updateCmd);
                    MessageBag bag        = new MessageBag(head, updateBody);

                    SendMessageBag(stream, bag);
                    resultVal = "";
                }
            }
            return(resultVal);
        }
Exemple #4
0
        /// <summary>
        /// 解析服务器返回的用户验证后的消息包
        /// </summary>
        /// <param name="bag"></param>
        /// <returns></returns>
        public string AnalyzeResponeMessage(MessageBag bag)
        {
            int state = 0;
            KeywordMessageType type = (KeywordMessageType)bag.Head.Type;

            if (type == KeywordMessageType.User || type == KeywordMessageType.Update)
            {
                state = bag.Head.State;
                switch (state)
                {
                case 0:        //失败
                    byte[] bytes = bag.BytesBody;
                    return(Encoding.UTF8.GetString(bytes));

                case 1:        //成功,版本一样
                    byte[] idBytes = bag.BytesBody;
                    Service.SessionId = Encoding.UTF8.GetString(idBytes);
                    return("true");

                case 2:        //成功,版本不一样
                    AnalyzeBodyBytes(bag);
                    return("true");

                default:
                    break;
                }
            }
            if (type == KeywordMessageType.Upload)
            {
                //1为验证; 2为更新
                state = bag.Head.State;
                if (state == 1)
                {
                    //0,表失败; 1表成功,并版本号一样; 2表成功,版本号不一样
                    int cmd = bag.Head.Cmd;
                    switch (cmd)
                    {
                    case 0:
                        byte[] bytes = bag.BytesBody;
                        return(Encoding.UTF8.GetString(bytes));

                    case 1:      //可以上传更新
                        byte[] idBytes = bag.BytesBody;
                        Service.SessionId = Encoding.UTF8.GetString(idBytes);
                        return("versionSameOfSuccess");

                    case 2:     //更新本地版本,重新显示
                        AnalyzeBodyBytes(bag);
                        return("versionDifferentOfSuccess");

                    default:
                        break;
                    }
                }
                else //状态为2 ,表示上传更新
                {
                    byte[] Bytes = bag.BytesBody;
                    //解析版本号
                    byte[] versionByte = new byte[versionLength];
                    Array.Copy(Bytes, 0, versionByte, 0, versionLength);
                    Service.DictVersion = Encoding.UTF8.GetString(versionByte);

                    //更新本地词库的字符串
                    int    leg       = versionLength + sessionIdLength;
                    int    length    = Bytes.Length - versionLength;
                    byte[] bodyBytes = new byte[length];
                    Array.Copy(Bytes, versionLength, bodyBytes, 0, length);
                    string body = Encoding.UTF8.GetString(bodyBytes);

                    Service.UpdateLocalDict(body);

                    return("true"); //更新本地词库成功
                }
            }
            return("");
        }