介绍开源的.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(1);

            if (serialisedHeader.Length - 1 > 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[0] = (byte)(serialisedHeader.Length - 1);

            if (serialisedHeader == null)
                throw new SerialisationException("Serialised header bytes should never be null.");

            return serialisedHeader;
        }

原文网址: http://www.cnblogs.com/csdev

时间: 2024-10-09 21:57:26

介绍开源的.net通信框架NetworkComms框架之四 消息边界的相关文章

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

原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架  作者是英国人  以前是收费的 目前作者已经开源  开源地址是:https://github.com/MarcFletcher/NetworkComms.Net 使用networkcomms框架通信时,客户端发送消息,服务器端回复消息. 在介绍开源的.net通信框架NetworkComms 一文中,我们介绍了如何从客户端发送字符串给服务器端,以及如何从服务

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

原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架  作者是英国人  以前是收费的 售价249英镑 我曾经花了2千多购买过此通讯框架, 目前作者已经开源  许可是:Apache License v2 开源地址是:https://github.com/MarcFletcher/NetworkComms.Net 这个框架给我的感觉是,代码很优美,运行很稳定,我有一个项目使用此框架已经稳定运行1年多.这个框架能够

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

原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架  作者是英国人  以前是收费的 目前作者已经开源  开源地址是:https://github.com/MarcFletcher/NetworkComms.Net 使用networkcomms框架通信时,客户端发送消息,服务器端回复消息. 确保收到的消息,是用户发来的,而不是恶意消息,可以在networkcomms框架中加入首字节验证机制. 思路是这样的:

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

原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架  作者是英国人  以前是收费的 目前作者已经开源  许可是:Apache License v2 开源地址是:https://github.com/MarcFletcher/NetworkComms.Net 我们知道TCP连接建立之后,如果没有心跳检测,连接一会就断开了.NetworkComms框架本身已经完美实现了心跳检测,我们在使用的时候不用再关心这个问

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

原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架  作者是英国人  以前是收费的 目前作者已经开源  许可是:Apache License v2 开源地址是:https://github.com/MarcFletcher/NetworkComms.Net 合并Dll 不属于网络通信部分的功能,NetworkComms 框架带有这样一个Demo,用于合并所有的DLL.很有用,所以单独讲一下. 程序实际调用的

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

原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架  作者是英国人  以前是收费的 目前作者已经开源  许可是:Apache License v2 开源地址是:https://github.com/MarcFletcher/NetworkComms.Net ConnectionInfo 是连接的信息类 用来存放连接类型(TCP,UDP),连接ID,创建连接时间,是否服务器端,本地地址,远端地址,最近通信时间

介绍开源的.net通信框架NetworkComms框架之三 传递List

原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架  作者是英国人  以前是收费的 目前作者已经开源  开源地址是:https://github.com/MarcFletcher/NetworkComms.Net 这一节讲一下,如何从服务器获取列表数据 示例图: 客户单点击 获取数据 从服务器返回数据 客户端代码: private void button4_Click(object sender, Even

介绍开源的.net通信框架NetworkComms框架 源码分析(一)ConnectionState

原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架  作者是英国人  以前是收费的 目前作者已经开源  许可是:Apache License v2 开源地址是:https://github.com/MarcFletcher/NetworkComms.Net public enum ConnectionState { /// <summary> /// The state of this connectio

介绍开源的.net通信框架NetworkComms框架之六 x509证书通信

原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架  作者是英国人  以前是收费的 目前作者已经开源  许可是:Apache License v2 开源地址是:https://github.com/MarcFletcher/NetworkComms.Net 首先对证书这一块,本人也不是特别了解,只是把NetworkComms本身带的Demo重新进行了整理.如果写的不对,请批评指正. 首先 服务器端: (1)