C#解决Socket丢包,段包,粘包算法
来源:互联网 发布:mac os系统软件下载 编辑:程序博客网 时间:2024/06/05 02:45
C#解决Socket丢包,段包,粘包算法:
/// <summary> /// Socket 丢包,段包,粘包 算法 /// </summary> public class RequestHandler { private string temp = string.Empty; /// <summary> /// 处理Socket 丢包,段包,粘包 算法 /// </summary> /// <param name="input"></param> /// <returns></returns> public string[] GetActualString(string input) { return GetActualString(input, null); } private string[] GetActualString(string input, List<string> outputList) { if (outputList == null) outputList = new List<string>(); if (!string.IsNullOrEmpty(temp)) input = temp + input; string output = ""; string patten = @"(?<=^\[length=)(\d+)(?=\])"; int length; if (Regex.IsMatch(input, patten)) { Match m = Regex.Match(input, patten); //获取消息字符串的有效长度 length = Convert.ToInt32(m.Groups[0].Value); //获取需要截取的位置 int startIndex = input.IndexOf(']') + 1; //获取从此位置开始后所有的字符串长度 output = input.Substring(startIndex); if (output.Length == length) { //如果output的长度 = 消息字符串应有长度 //说明刚好是完整的一条信息 outputList.Add(output); temp = ""; } else if (output.Length < length) { //如果output的长度 < 消息字符串应有长度 //说明没有发完整,则应该将整条消息,包括元数据,全部缓存 temp = input; } else if (output.Length > length) { //如果之后的长度大于应有的长度, //说明消息发完整了,但是有多余的数据 //多余的数据可能是截断消息,也可能是多条完整消息 //截取字符串 output = output.Substring(0, length); outputList.Add(output); temp = ""; //缩短 input 的长度 input = input.Substring(startIndex + length); //递归调用 GetActualString(input, outputList); } } else { //说明 "[","]"就不完整 temp = input; } return outputList.ToArray(); } /// <summary> /// 测试数据 /// </summary> public static void Test() { RequestHandler handler = new RequestHandler(); string input; //第一种情况测试;发送一条完整消息 input = "[length=13]明天中秋,祝大家节日快乐!"; handler.PrintOutput(input); //第二种情况;两条完整消息一次性发送 input = "明天中秋,祝大家节日快乐!"; input = string.Format("[length=13]{0}[length=13]{0}", input); handler.PrintOutput(input); //第三种情况测试A ;两条消息不完整发送 input = "[length=13]明天中秋,祝大家节日快乐![length=13]明天中秋"; handler.PrintOutput(input); input = ",祝大家节日快乐!"; handler.PrintOutput(input); //第三种情况测试B;两条消息不完整发送 input = "[length=13]明天中秋,祝大家"; handler.PrintOutput(input); input = "节日快乐![length=13]明天中秋,祝大家节日快乐!"; handler.PrintOutput(input); //第四种情况:元数据不完整 input = "[leng"; handler.PrintOutput(input); input = "th=13]明天中秋,祝大家节日快乐!"; handler.PrintOutput(input); } /// <summary> /// 打印 /// </summary> /// <param name="input"></param> pri
新建控制台应用重新,调用里面的Test方法:
class Program { static void Main(string[] args) { RequestHandler.Test(); Console.Read(); } }运行结果:
注:本文来自《.NET之美 》 作者:张子阳
0 0
- C#解决Socket丢包,段包,粘包算法
- c# socket 解决粘包,半包
- C# Socket粘包
- 解决TCP粘包算法
- java socket解决半包、粘包问题
- C# SOCKET 粘包、断包处理(一)
- erlang 解决socket 数据粘包问题
- C# Socket的粘包处理
- Socket粘包,分包解决方法和算法
- Socket粘包问题
- Socket粘包问题
- Socket粘包问题
- Socket粘包问题
- Socket粘包问题
- SOCKET粘包问题
- Socket粘包问题
- Socket粘包问题
- socket粘包
- 使用dblink和数据泵将数据由10g迁到11g
- Socket编程---最浅显易懂的介绍
- 笔记之缺省servlet是什么鬼
- 使用HTML5 WebDataBase设计离线数据库
- android 中获取sha1值的详细说明
- C#解决Socket丢包,段包,粘包算法
- 安卓中关于事件处理方式以Button为例实现点击事件监听
- 168. Excel Sheet Column Title
- 遍历Map的四种方法
- java集合Collection讲解
- Android EditText不弹出输入法总结,焦点问题的总结
- 暂时不知道这是什么错误,等我知道了我再给你起标题,哈哈哈
- 电脑显卡天梯图
- 诚信&推荐【牛津大学|毕业|】Oxford毕业颁发学历