介绍开源的.net通信框架NetworkComms框架之四 消息边界
原文网址: http://www.cnblogs.com/csdev
Networkcomms 是一款C# 语言编写的TCP/UDP通信框架 作者是英国人 以前是收费的 目前作者已经开源 许可是:Apache License v2
开源地址是:https://github.com/MarcFletcher/NetworkComms.Net
首先,使用TCP通信的时候存在消息边界的问题,也就是如何处理粘包问题,networkcomms 框架本身已经对这个问题有内置的解决方案,我们在使用框架时直接数据通信即可,不需要关心消息边界问题。
下面我们来分析一下networkcomms对消息边界问题是如何进行处理的。
 TCP无保护消息边界的解决
 针对这个问题,一般有3种解决方案:
(1)发送固定长度的消息
(2)把消息的尺寸与消息一块发送
(3)使用特殊标记来区分消息间隔
NetworkComms通信框架使用的是第二种 即消息的尺寸与消息一块发送

来看一下这个流程
客户端发送一个类给服务器端
代码如下:
  User  user1=new User ();
  user1.UserID="10000";
  user1.Name="天涯共此时";
connection.SendObject("消息类型", user1);
然后networkcomms框架开始发送这个类
在ConnectionSendClose.cs文件中
判断发送的类,是否是Packet类型,如果是使用SendPacket进行发送。如果不是,转换成Packet类型再发送
   public void SendObject<sendObjectType>(string sendingPacketType, sendObjectType objectToSend, SendReceiveOptions options, out long packetSequenceNumber)
        {            //判断发送的类,是否是Packet类型
            Packet objectToSendAsPacket = objectToSend as Packet;
            if (objectToSendAsPacket == null)
            {               //如果不是,转换成Packet类型再发送
                using (Packet sendPacket = new Packet(sendingPacketType, objectToSend, options))
                    SendPacket<sendObjectType>(sendPacket, out packetSequenceNumber);
            }
            else
            {
                if (objectToSendAsPacket.PacketHeader.PacketType != sendingPacketType)
                    throw new ArgumentException("Unable to send object of type Packet if the PacketHeader.PacketType and sendingPacketType do not match.");
                SendPacket<sendObjectType>(objectToSendAsPacket, out packetSequenceNumber);
            }
        }
上面的代码中,通过这一句
Packet sendPacket = new Packet(sendingPacketType, objectToSend, options)把要发送的User类转化为Packet类 来分析一下Packet类
 public Packet(string sendingPacketTypeStr, string requestReturnPacketTypeStr, object payloadObject, SendReceiveOptions options)
        {
            Constructor(sendingPacketTypeStr, requestReturnPacketTypeStr, payloadObject, options, false);
        }
要发送的数据类(此次为User类型数据),以参数的形式赋值给Packet.
Packet类,经过一些类内部处理,User类数据,最后经过转化存放在PacketData属性中,也就是包体数据。
Packet类中的SerialiseHeader(SendReceiveOptions options)返回的是包头(PacketHeader)序列化后的数据
Connection类中的SendPacketSpecific方法会先发送包头数据,再发送包体数据。
我们看一下Packet中序列化包头的方法
   /// <inheritdoc />
        public byte[] SerialiseHeader(SendReceiveOptions options)
        {
            if (options == null) throw new ArgumentNullException("options", "Provided SendReceiveOptions cannot be null.");
            //We need to start of by serialising the header
            //把包头序列化为二进制数组
            byte[] serialisedHeader;
            using (StreamTools.StreamSendWrapper sendWrapper = options.DataSerializer.SerialiseDataObject(_packetHeader, options.DataProcessors, null))
                serialisedHeader = sendWrapper.ThreadSafeStream.ToArray();
             > byte.MaxValue)
                throw new SerialisationException("Unable to send packet as header size is larger than Byte.MaxValue. Try reducing the length of provided packetTypeStr or turning off checkSum validation.");
            //The first byte now specifies the header size (allows for variable header size)
            //包头转化成的二进制数据,第一个字节的值,设定为包头的长度
            serialisedHeader[] = ();
            if (serialisedHeader == null)
                throw new SerialisationException("Serialised header bytes should never be null.");
            return serialisedHeader;
        }
原文网址: http://www.cnblogs.com/csdev
介绍开源的.net通信框架NetworkComms框架之四 消息边界的更多相关文章
- 介绍开源的.net通信框架NetworkComms框架 源码分析
		原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架 作者是英国人 以前是收费的 售价249英镑 我曾经花了 ... 
- 介绍开源的.net通信框架NetworkComms框架之二  传递类
		原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架 作者是英国人 以前是收费的 目前作者已经开源 开源地 ... 
- 介绍开源的.net通信框架NetworkComms框架 源码分析(五)ReservedPacketType
		原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架 作者是英国人 以前是收费的 目前作者已经开源 许可是 ... 
- 介绍开源的.net通信框架NetworkComms框架 源码分析(三)PacketHeader
		原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架 作者是英国人 以前是收费的 目前作者已经开源 许可是 ... 
- 介绍开源的.net通信框架NetworkComms框架之一 首字节验证
		原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架 作者是英国人 以前是收费的 目前作者已经开源 开源地 ... 
- 介绍开源的.net通信框架NetworkComms框架之五  心跳检测
		原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架 作者是英国人 以前是收费的 目前作者已经开源 许可是 ... 
- 介绍开源的.net通信框架NetworkComms框架之九  合并DLL
		原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架 作者是英国人 以前是收费的 目前作者已经开源 许可是 ... 
- 介绍开源的.net通信框架NetworkComms
		Networkcomms 是一款C# 语言编写的TCP/UDP通信框架 作者是英国人 以前是收费的 目前作者已经开源 开源地址是:https://github.com/MarcFletcher/ ... 
- 介绍开源的.net通信框架NetworkComms框架 源码分析(二)ConnectionInfo
		原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架 作者是英国人 以前是收费的 目前作者已经开源 许可是 ... 
随机推荐
- 检测Linux VPS是Xen、OpenVZ还是KVM真假方法
			如果大家对自己购买和使用的VPS需要检测是否为真的Xen,我们可以用如下方法进行测试.比较专业的就是用virt-what脚本进行检测.检测Linux VPS是Xen.OpenVZ还是KVM真假方法方法 ... 
- 【HOW】SharePoint如何彻底删除用户
			在网站中打开“人员和组”,在选中某一用户后,一般只有“从用户组中删除用户”操作.此操作只能将此用户从此用户组中删除,却不能从网站集中彻底删除. 要将用户从网站集中彻底删除,可按如下步骤操作: 1. 在 ... 
- sqlserver获取数据库表结构
			SqlServer获取所有数据库,表,表结构 --获取所有数据库 SELECT * FROM Master..SysDatabases ORDER BY Name --获取test数据库下所有表 us ... 
- html基础 链接
			使用图像来作链接: (链接标签中嵌套图片标签) <html> <body> <p> 您也可以使用图像来作链接: <a href="/example/ ... 
- adb 命令集合
			1. adb shell 2. adb version 查看 adb 安装版本 3. adb start-server 启动服务 4. adb kill-server 杀死服务 5. adb get- ... 
- Oracle数据库监听服务无法启动
			(1) 安装好Oracle后,启动Net Manager,测试orcl失败,报错“ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务”,需要修改监听文件.修改前: # list ... 
- window7下使用vagrant打造lamp开发环境(二)
			上一节我们基本把软件跟系统环境,以及连接虚拟机给配置好了,下面我们将要进行开发环境的搭建(lamp) 这里安装其实很简单,因为我们用的centos,所以很大一部分安装都是通过yum安装 关于yum的详 ... 
- Build subversion 1.8 with SSL on OS X Yosemite
			mkdir -p /tmp/buildroot && cd /tmp/buildroot # Need to build the latest libtool and automake ... 
- Linux 文件与目录管理
			Linux 文件与目录管理 我们知道Linux的目录结构为树状结构,最顶级的目录为根目录 /. 其他目录通过挂载可以将它们添加到树中,通过解除挂载可以移除它们. 在开始本教程前我们需要先知道什么是绝对 ... 
- Linux:history命令记录操作时间、操作用户、操作IP
			[步骤] 1./etc/profile文件中加入以下内容 2.执行:source /etc/profile [效果] 
