十年河東,十年河西,莫欺少年窮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)表明鏈接對象,數據(字節[]),成功(布爾)
框架
-
- 初始化套接字(對應三種模式)
實例化服務器類TcpPushServer / TcpPullServer / TcpPackServer
實例化客戶端類TcpPushClient / TcpPullClient / TcpPackClient參數介紹int numConnections每一個套接字I / O操做的最大同時鏈接數,int receiveBufferSize緩衝區大小(接收器),int超時時間(秒)(每10秒檢查一次),當值爲0時不設置超時,uint headerFlag標頭標籤範圍爲0〜1023(0x3FF),當標頭標識符等於0時不檢查標頭
異步 -
- 開始監視/鏈接服務器
服務器server.Start(端口);
客戶端client.Connect(ip,端口);
socket -
- 觸發鏈接事件
服務器server.OnAccept(connectId); 收到鏈接ID,可用於發送,接收,關閉標籤
Client client.OnConnect(success);。接收是否成功鏈接到服務器 -
- 發送消息
服務器server.Send(connectId,data,offset,length);
客戶端client.Send(數據,偏移量,長度); -
- 觸發已發送事件
服務器server.OnSend(connectId,length);
客戶端client.OnSend(長度); -
- 觸發接收事件
服務器server.OnReceive(connectId,data);
客戶端client.OnReceive(數據); -
- 關閉鏈接
服務器server.Close(connectId);
客戶端client.Close(); -
- 觸發關閉鏈接事件
服務器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設置應用程序
服務器其餘方法介紹
-
- bool SetAttached(int connectId,對象數據)
服務器爲每一個客戶端設置其餘數據,以防止用戶創建用戶映射表
-
- T GetAttached(int connectId)
獲取指定客戶端的其餘數據
-
- 屬性:ConcurrentDictionary <int,string> ClientList
獲取正在鏈接的客戶端信息<connectId,ip和port>
二:UDP模塊介紹
-
- 初始化UDP實現類UdpServer / UdpClients
服務器socket.core.Server.UdpServer
客戶端socket.core.Client.UdpClients
參數int receiveBufferSize每一個套接字I / O操做(接收器)的緩衝區大小 -
- 發送數據
服務器server.Send(remoteEndPoint,數據,偏移量,長度)
客戶端client.Send(數據,偏移量,長度)
Client client.Send(remoteEndPoint,數據,偏移量,長度) -
- 觸發已發送事件
服務器server.OnSend(remoteEndPoint,長度)
客戶端client.OnSend (長度) -
- 觸發接收事件
服務器server.OnReceive(remoteEndPoint,數據,偏移量,長度)
客戶端client.OnReceive(數據,偏移量,長度)
@天才臥龍的博客