十年河东,十年河西,莫欺少年穷
学无止境,精益求精
最近一段时间,
我的大多数精力都放在了系统架构,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(数据,偏移量,长度)
@天才卧龙的博客