zoukankan      html  css  js  c++  java
  • 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(数据,偏移量,长度)

    @天才卧龙的博客

  • 相关阅读:
    [转载] 常用CASE工具介绍
    GridView, DataGrid 中,DataFormatString语法汇总
    [轉]SQL Server中数据类型详解
    强烈推荐asp.net数据访问的官方指南系列 (Data Access Tutorials)
    实现iFrame自适应高度,原来很简单!
    [转]Web service到底是什么?在什么情况下,你应该使用web service
    贴一个查询SQL Server数据库中所有表及其描述(Description)的SQL语句
    C#中,String和string的区别
    ERWin 连接SQL Sever2005的问题
    [转载]ERwin相关概念入门
  • 原文地址:https://www.cnblogs.com/chenwolong/p/socketCore.html
Copyright © 2011-2022 走看看