原文网址: 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框架之四 消息边界的更多相关文章

  1. 介绍开源的.net通信框架NetworkComms框架 源码分析

    原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架  作者是英国人  以前是收费的 售价249英镑 我曾经花了 ...

  2. 介绍开源的.net通信框架NetworkComms框架之二 传递类

    原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架  作者是英国人  以前是收费的 目前作者已经开源  开源地 ...

  3. 介绍开源的.net通信框架NetworkComms框架 源码分析(五)ReservedPacketType

    原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架  作者是英国人  以前是收费的 目前作者已经开源  许可是 ...

  4. 介绍开源的.net通信框架NetworkComms框架 源码分析(三)PacketHeader

    原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架  作者是英国人  以前是收费的 目前作者已经开源  许可是 ...

  5. 介绍开源的.net通信框架NetworkComms框架之一 首字节验证

    原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架  作者是英国人  以前是收费的 目前作者已经开源  开源地 ...

  6. 介绍开源的.net通信框架NetworkComms框架之五 心跳检测

    原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架  作者是英国人  以前是收费的 目前作者已经开源  许可是 ...

  7. 介绍开源的.net通信框架NetworkComms框架之九 合并DLL

    原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架  作者是英国人  以前是收费的 目前作者已经开源  许可是 ...

  8. 介绍开源的.net通信框架NetworkComms

    Networkcomms 是一款C# 语言编写的TCP/UDP通信框架  作者是英国人  以前是收费的 目前作者已经开源  开源地址是:https://github.com/MarcFletcher/ ...

  9. 介绍开源的.net通信框架NetworkComms框架 源码分析(二)ConnectionInfo

    原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架  作者是英国人  以前是收费的 目前作者已经开源  许可是 ...

随机推荐

  1. VM12.1.1 下载 序列号

    VF5XA-FNDDJ-085GZ-4NXZ9-N20E6UC5MR-8NE16-H81WY-R7QGV-QG2D8ZG1WH-ATY96-H80QP-X7PEX-Y30V4AA3E0-0VDE1-0 ...

  2. 双系统先装Windows,后装linux的原因

    由于windows在安装时,boot loader会预设装在MBR及分割槽的boot sector中,而且并不提供开机选单:而linux在安装时安装程序可以选择是安装在MBR中还是boot secto ...

  3. 用Canvas制作loading动画

    上一篇讲到用SVG制作loading动画,其中提到了线性渐变在扇形区域中的问题,并且用SVG SIML语法制作的loading动画并不是所有浏览器都兼容,所以现在用Canvas重新实现了一遍. 这里与 ...

  4. New Begin--工作一年所思所感小记

    有段日子没有更新Blog了,这段时间过得有些散漫,今天看完了两本书,感触颇多,让我繁杂的心绪又重归平静,想写一些什么,遂有了这篇文章. 所谓的一年是从13年7月9日我正是入职算起,到现在为止一年有余, ...

  5. URL中文转码问题

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  6. AES加密算法实现

    AES算法是一种对称加密算法,是美国国家标准技术研究所NIST旨在取代DES的21世纪的加密标准. 下文实例中,密钥采用了直接写死的方式,实际使用中可以配合RSA加密算法加密密钥,从而达到更好的安全效 ...

  7. stimulsoft Report报表使用笔记

    1.使用设计器设计mrt报表模板,或者从其他文件复制修改 2.删除business object 数据源 3.使用代码添加数据源 ParcelChangeItem change = new Parce ...

  8. android 非activity如何得到布局文件 (java文件中获取布局文件)

    Android中得到布局文件对象有两种方式第一种,在Activity所在类中this.getLayoutInflater().inflater(R.layout.布局文件名,null);第二种,在非A ...

  9. <读书笔记>软件调试之道 :问题的核心-诊断

    声明:本文档的内容主要来源于书籍<软件调试修炼之道>作者Paul Butcher,属于读书笔记. 不要急于动手! 尽管可以利用各种工具和技术以及软件自身查找缺陷,但是你最重要的财富是你的智 ...

  10. FusionCharts中仪表盘相关属性

    上上周用FusionCharts做了几个报表,里面有个仪表盘,当时查属性查疯了,现在把相关的一些属性记下来,方便以后查找. -------------------------仪表盘重要属性解析---- ...