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

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

学无止境,精益求精

最近一段时间,

我的大多数精力都放在了系统架构,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,端口);

    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(数据,偏移量,长度)

@天才卧龙的博客

posted @ 2020-09-15 17:35  天才卧龙  阅读(1035)  评论(4编辑  收藏  举报