十年河東,十年河西,莫欺少年窮
學無止境,精益求精
最近一段時間,
我的大多數精力都放在了系統架構,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,端口); -
- 觸發連接事件
服務器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(數據,偏移量,長度)
@天才卧龍的博客