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(數據,偏移量,長度)

@天才臥龍的博客

相關文章
相關標籤/搜索