Пример #1
0
        /// <summary>
        /// 拆包
        /// </summary>
        /// <returns></returns>
        public AsyncSocketMessageFlag Split()
        {
            this.m_splits = this.m_package.Split(DEFAULT_SEPARATOR);    //返回由'/'分隔的子字符串数组
            Console.WriteLine("信息头的长度" + this.m_splits.Length);
            foreach (string s in m_splits)
            {
                Console.WriteLine(s);
            }

            //  近会出现一下几种粘包问题
            //QUERY_UNSIGN_CONTRACT_REQUEST; 1; 1; QUERY_SIGN_REFUSE_REQUEST; 1; 1;
            //QUERY_REQUEST; QUERY_SIGN_REFUSE_REQUEST; 1; 1;
            //QUERY_SIGN_REFUSE_REQUEST; 1; 1; QUERY_REQUEST;
            //QUERY_REQUEST; QUERY_REQUEST;

            // 3数据格式说明数据中有[数据头 + 长度 + 数据]
            if (this.m_splits.Length == 3)
            {
                this.m_head = this.m_splits[0];
                this.m_length = int.Parse(this.m_splits[1]);

                // 此处应该处理丢包或者粘包的问题
                if(this.m_splits[2].Length == this.m_length)       ///  接收正常
                {
                    this.m_message = this.m_splits[2];
                    this.m_flag = AsyncSocketMessageFlag.MESSAGE_RIGHT;
                }
                else if (this.m_splits[2].Length > this.m_length) //  后面接收到的数据长度大于发送长度 -=> 粘包
                {   // 粘包时有两种处理方案,
                    // 第一种方案是丢弃后面的包
                    // 第二种方案是将后面的数据重新拆解
                    this.m_message = this.m_splits[2].Substring(0, this.m_length);

                    //  此时后面的数据还有信息,那么我们应该截取出后面的数据放到缓存里面
                    this.m_flag = AsyncSocketMessageFlag.MESSAGE_PASTE;         //  粘包
                    int currLength = this.m_head.Length + this.m_length.ToString().Length + this.m_message.Length;
                    this.m_cache = this.m_package.Substring(currLength, this.m_package.Length);
                }
                else if (this.m_splits[2].Length < this.m_length)    // 丢包
                {   // 丢包时使用stringbuilder重复接收
                    //////////////////////////////////////////
                    this.m_message = this.m_splits[2];////////
                    //////////////////////////////////////////

                    this.m_flag = AsyncSocketMessageFlag.MESSAGE_RIGHT;
                }
            }
            else if (this.m_splits.Length > 3 && this.m_splits.Length % 2 != 0)   //  出现了整个数据包的粘连,我们截取出需要的长度
            {
                this.m_head = this.m_splits[0];
                this.m_length = int.Parse(this.m_splits[1]);

                // 此处应该处理丢包或者粘包的问题
                if (this.m_splits[2].Length > this.m_length) //  后面接收到的数据长度大于发送长度 -=> 粘包
                {
                    // 粘包时有两种处理方案,
                    // 第一种方案是丢弃后面的包
                    // 第二种方案是将后面的数据重新拆解
                    this.m_message = this.m_splits[2].Substring(0, this.m_length);
                    // QUERY_UNSIGN_CONTRACT_REQUEST;1;1QUERY_SIGN_REFUSE_REQUEST;1;1

                    this.m_flag = AsyncSocketMessageFlag.MESSAGE_PASTE;         //  粘包
                    int currLength = this.m_head.Length + this.m_length.ToString().Length + this.m_message.Length + 2 * DEFAULT_SEPARATOR.ToString().Length;
                    this.m_cache = this.m_package.Substring(currLength);
                    this.m_package = this.m_cache;
                }
            }
            else   //  1个包或者粘连了多个包,程序无法处理直接跳出
            {
                this.m_flag = AsyncSocketMessageFlag.MESSAGE_UNKOWN;
                this.m_head = "UNKOWN";         //  未知错误
            }
            return m_flag;
        }
Пример #2
0
        /// <summary>
        /// 拆包
        /// </summary>
        /// <returns></returns>
        public AsyncSocketMessageFlag Split()
        {
            this.m_splits = this.m_package.Split(DEFAULT_SEPARATOR);    //返回由'/'分隔的子字符串数组
            Console.WriteLine("信息头的长度" + this.m_splits.Length);
            foreach (string s in m_splits)
            {
                Console.WriteLine(s);
            }


            //  近会出现一下几种粘包问题
            //QUERY_UNSIGN_CONTRACT_REQUEST; 1; 1; QUERY_SIGN_REFUSE_REQUEST; 1; 1;
            //QUERY_REQUEST; QUERY_SIGN_REFUSE_REQUEST; 1; 1;
            //QUERY_SIGN_REFUSE_REQUEST; 1; 1; QUERY_REQUEST;
            //QUERY_REQUEST; QUERY_REQUEST;



            // 3数据格式说明数据中有[数据头 + 长度 + 数据]
            if (this.m_splits.Length == 3)
            {
                this.m_head   = this.m_splits[0];
                this.m_length = int.Parse(this.m_splits[1]);

                // 此处应该处理丢包或者粘包的问题
                if (this.m_splits[2].Length == this.m_length)       ///  接收正常
                {
                    this.m_message = this.m_splits[2];
                    this.m_flag    = AsyncSocketMessageFlag.MESSAGE_RIGHT;
                }
                else if (this.m_splits[2].Length > this.m_length) //  后面接收到的数据长度大于发送长度 -=> 粘包
                {                                                 // 粘包时有两种处理方案,
                    // 第一种方案是丢弃后面的包
                    // 第二种方案是将后面的数据重新拆解
                    this.m_message = this.m_splits[2].Substring(0, this.m_length);

                    //  此时后面的数据还有信息,那么我们应该截取出后面的数据放到缓存里面
                    this.m_flag = AsyncSocketMessageFlag.MESSAGE_PASTE;         //  粘包
                    int currLength = this.m_head.Length + this.m_length.ToString().Length + this.m_message.Length;
                    this.m_cache = this.m_package.Substring(currLength, this.m_package.Length);
                }
                else if (this.m_splits[2].Length < this.m_length) // 丢包
                {                                                 // 丢包时使用stringbuilder重复接收
                    //////////////////////////////////////////
                    this.m_message = this.m_splits[2];            ////////
                    //////////////////////////////////////////

                    this.m_flag = AsyncSocketMessageFlag.MESSAGE_RIGHT;
                }
            }
            else if (this.m_splits.Length > 3 && this.m_splits.Length % 2 != 0)   //  出现了整个数据包的粘连,我们截取出需要的长度
            {
                this.m_head   = this.m_splits[0];
                this.m_length = int.Parse(this.m_splits[1]);

                // 此处应该处理丢包或者粘包的问题
                if (this.m_splits[2].Length > this.m_length) //  后面接收到的数据长度大于发送长度 -=> 粘包
                {
                    // 粘包时有两种处理方案,
                    // 第一种方案是丢弃后面的包
                    // 第二种方案是将后面的数据重新拆解
                    this.m_message = this.m_splits[2].Substring(0, this.m_length);
                    // QUERY_UNSIGN_CONTRACT_REQUEST;1;1QUERY_SIGN_REFUSE_REQUEST;1;1

                    this.m_flag = AsyncSocketMessageFlag.MESSAGE_PASTE;         //  粘包
                    int currLength = this.m_head.Length + this.m_length.ToString().Length + this.m_message.Length + 2 * DEFAULT_SEPARATOR.ToString().Length;
                    this.m_cache   = this.m_package.Substring(currLength);
                    this.m_package = this.m_cache;
                }
            }
            else   //  1个包或者粘连了多个包,程序无法处理直接跳出
            {
                this.m_flag = AsyncSocketMessageFlag.MESSAGE_UNKOWN;
                this.m_head = "UNKOWN";         //  未知错误
            }
            return(m_flag);
        }