Tcp/ip及Udp编程之Socket.Core 开源框架---如何理解TCP粘包原理及解决方案

十年河东,十年河西,莫欺少年穷linux

学无止境,精益求精算法

最近一段时间,编程

个人大多数精力都放在了系统架构,IOT+MQTT 物联网编程,Tcp/Ip协议Socket编程,这些方面的知识,在我以前职业生涯不多接触过的。服务器

首先介绍下Socket.Core框架网络

【框架介绍:https://awesomeopensource.com/project/fengma312/socket.core   或  https://files.cnblogs.com/files/chenwolong/SocketCore.zip】架构

TCP模块简介
Server socket.core.Server命名空间分别在socket.core下三种模式push / pull / pack。
客户端的客户端名称空间,有三种模式push / pull / pack

并发

主要过程以及相应的方法和事件介绍。
注意:connectId(guid)表明链接对象,数据(字节[]),成功(布尔)
  

框架

    1. 初始化套接字(对应三种模式)

    实例化服务器类TcpPushServer / TcpPullServer / TcpPackServer 
    实例化客户端类TcpPushClient / TcpPullClient / TcpPackClient参数介绍int numConnections每一个套接字I / O操做的最大同时链接数,int receiveBufferSize缓冲区大小(接收器),int超时时间(秒)(每10秒检查一次),当值为0时不设置超时,uint headerFlag标头标签范围为0〜1023(0x3FF),当标头标识符等于0时不检查标头
    异步

    1. 开始监视/链接服务器

    服务器server.Start(端口);
    客户端client.Connect(ip,端口);
    socket

    1. 触发链接事件

    服务器server.OnAccept(connectId); 收到链接ID,可用于发送,接收,关闭标签
    Client client.OnConnect(success);。接收是否成功链接到服务器

    1. 发送消息

    服务器server.Send(connectId,data,offset,length); 
    客户端client.Send(数据,偏移量,长度);

    1. 触发已发送事件

    服务器server.OnSend(connectId,length); 
    客户端client.OnSend(长度);

    1. 触发接收事件

    服务器server.OnReceive(connectId,data); 
    客户端client.OnReceive(数据);

    1. 关闭链接

    服务器server.Close(connectId); 
    客户端client.Close();

    1. 触发关闭链接事件

    服务器server.OnClose(connectId); 
    客户端client.OnClose();

三种型号介绍

  • 一:推

    将触发监视事件对象OnReceive(connectId,数据);数据当即“推送”到应用程序

  • 二:拉

    OnReceive(connectId,长度),它告诉应用程序已接收了多少数据。应用程序检查数据的长度。若是知足,它将调用组件的Fetch(connectId,length)方法,将数据“拉出”

  • 三:包

    pack模型组件是推拉模型的组合。该应用程序没必要处理分包合同【也就是所谓的Tcp沾包】。该组件保证每一个应用程序server.OnReceive(connectId,数据)/client.OnReceive(数据)事件为应用程序提供完整的数据包。注意:包模型组件会自动向每一个应用程序添加4字节(32位)标头应用程序发送的数据包。当组件接收到数据时,它将根据标头信息自动打包。每一个完整的数据包都发送到OnReceive事件被发送到应用程序PACK标头格式(4字节)4 * 8 = 32 
    XXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYYY
    前10个X位是标头标识位,用于数据包验证。有效报头标识值的范围是0到1023(0x3FF)。当标头标识等于0时,不检查标头。Y的最后22位是长度位。包装长度。最大有效数据包长度不能超过4194303(0x3FFFFF)个字节(字节),能够经过TcpPackServer / TcpPackClient构造函数参数headerFlag设置应用程序

服务器其余方法介绍

    1. bool SetAttached(int connectId,对象数据)

服务器为每一个客户端设置其余数据,以防止用户创建用户映射表

    1. T GetAttached(int connectId)

获取指定客户端的其余数据

    1. 属性:ConcurrentDictionary <int,string> ClientList

获取正在链接的客户端信息<connectId,ip和port>

二:UDP模块介绍

      1. 初始化UDP实现类UdpServer / UdpClients

      服务器socket.core.Server.UdpServer 
      客户端socket.core.Client.UdpClients 
      参数int receiveBufferSize每一个套接字I / O操做(接收器)的缓冲区大小

      1. 发送数据

      服务器server.Send(remoteEndPoint,数据,偏移量,长度)
      客户端client.Send(数据,偏移量,长度)
      Client client.Send(remoteEndPoint,数据,偏移量,长度)

      1. 触发已发送事件

      服务器server.OnSend(remoteEndPoint,长度)
      客户端client.OnSend (长度)

      1. 触发接收事件

      服务器server.OnReceive(remoteEndPoint,数据,偏移量,长度)
      客户端client.OnReceive(数据,偏移量,长度)

@天才卧龙的博客

相关文章
相关标签/搜索