• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > C# Socket粘包处理讲解示例

C# Socket粘包处理讲解示例

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c#socket通信实例,c#socket,c#socket异步通信,c#socket网络编程,c#socket视频教程等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

当socket接收到数据后,会根据buffer的大小一点一点的接收数据,比如:

对方发来了1M的数据量过来,但是,本地的buffer只有1024字节,那就代表socket需要重复很多次才能真正收完这逻辑上的一整个消息。
对方发来了5条2个字符的消息,本地的buffer(大小1024字节)会将这5条消息全部收入囊下...
那么,如何处理呢?下面我以最简单的一种文本消息来demo

根据上面所描述的情况,最重要的关键落在了下面3个因素的处理上

消息的结尾标记
接收消息时判断结尾标记
当本次buffer中没有结尾标记时怎么处理
我把写好的核心算法贴出来:

                string rawMsg=System.Text.Encoding.Default.GetString(buffer, 0, receivedSize);
                int rnFixLength = terminateString.Length;   //这个是指消息结束符的长度,此处为\r\n
                for(int i=0;i<rawMsg.Length;)               //遍历接收到的整个buffer文本
                {
                    if (i <= rawMsg.Length - rnFixLength)
                    {
                        if (rawMsg.Substring(i, rnFixLength) != terminateString)//非消息结束符,则加入sb
                        {
                            sb.Append(rawMsg[i]);
                            i++;
                        }
                        else
                        {
                            this.OnNewMessageReceived(sb.ToString());//找到了消息结束符,触发消息接收完成事件
                            sb.Clear();
                            i += rnFixLength;
                        }  
                    }
                    else
                    {
                        sb.Append(rawMsg[i]);
                        i++;
                    }
                }
            }
        }
</div>

这个组件的使用方法:

 

        static void client_NewMessageReceived(string msg)
        {
            Console.WriteLine(msg);
        }
</div>

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C#使用Socket快速判断数据库连接是否正常的方法
  • C#选择法排序实例分析
  • C#使用Socket上传并保存图片的方法
  • C#使用动态规划解决0-1背包问题实例分析
  • C#使用Socket实现发送和接收图片的方法
  • C#插入法排序算法实例分析
  • C#中异步Socket通信编程代码实例
  • C#中FormsAuthentication用法实例
  • C# Socket网络编程实例
  • C#使用Socket发送和接收TCP数据实例

相关文章

  • 2017-05-28时间字符串转换成日期对象datetime的方法
  • 2017-05-28C#加密算法汇总(推荐)
  • 2017-05-28C#结合JavaScript实现秒杀倒计时的方法
  • 2017-05-28C#自定义缓存封装类实例
  • 2017-05-28深入理解C#的数组
  • 2017-05-28C#中使用XmlDocument类来创建和修改XML格式的数据文件
  • 2017-05-28C#窗体间通讯处理的几种方法总结
  • 2017-05-28C#接口(Interface)用法分析
  • 2017-05-28c#取得控制台应用程序根目录
  • 2017-05-28C#数据结构之顺序表(SeqList)实例详解

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#实现翻转字符串的方法
    • C#编程实现自定义热键的方法
    • C#类概念介绍
    • WinForm窗体间传值的方法
    • C#打开php链接传参然后接收返回值的关键代码
    • C#学习基础概念二十五问 11-15
    • 浅谈C#基础之类的访问修饰符
    • C#非矩形窗体实现方法
    • c#中xml文档注释编译dll引用到其它项目示例
    • C#编程实现四舍五入、向上及下取整的方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有