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

@天才卧龍的博客


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM