/// <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; }
/// <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); }