PacketHeader类(NetworkComms 2.3.1源码了解和学习)

networkComms.net2.3.1版本为开源网络通讯框架,基于GPLv3协议发布。该框架提供了一种用于发送、接收及数据包管理的有效机制。PacketHeader类负责管理数据包的元数据,如类型、大小等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

networkComms.net2.3.1开源版本,基于gpl V3协议。因为不能公开3.x版本的源码,所以基于此版本进行学习。3.X版本进行了诸多改进和Bug修复,使用方法上两者相差不大。
/*请注意使用以下代码,需遵循GplV3协议*/ 来自英国剑桥的c#网络通讯框架 开源版本: networkcomms2.3.1  可以进入此页面下载 networkcomms网络通讯框架学习  /// <summary> /// PacketHeader 包含发送,接收,重建数据包的相关信息 /// </summary> [ProtoContract] public sealed class PacketHeader { [ProtoMember(1)] Dictionary<PacketHeaderLongItems, long> longItems; [ProtoMember(2)] Dictionary<PacketHeaderStringItems, string> stringItems; /// <summary> /// Blank constructor required for deserialisation /// </summary> #if iOS || ANDROID public PacketHeader() { } #else private PacketHeader() { } #endif /// <summary> /// 创建一个数据包头 /// </summary> /// <param name="packetTypeStr">数据包类型.</param> /// <param name="payloadPacketSize">数据包的大小,注意不是包包头的大小</param> /// <param name="requestedReturnPacketTypeStr">返回的类型</param> /// <param name="receiveConfirmationRequired">是否需要确认收到</param> /// <param name="checkSumHash">检验和</param> /// <param name="includeConstructionTime">是否包含创建时间</param> // 这里说一下 数据包类型和 返回的类型 这个类型的作用在于定位,比如登陆时,我发送一个 User类,数据包类型我可以设定为"a01",然后在服务器的 // 处理程序中,我针对"a01"进行处理。a01可以换成其他的字符,只是个定位作用。 // 返回的类型,比如我发送一个 User类,数据包类型"a1",设定返回的类型"b1",然后在服务器的处理程序中,根据"a1"进行相应的处理,处理完成后发送一个 // 处理结果的消息给客户端,这个消息就需要设定类型为前面我们预设的"b1"类型,客户端一直在等待"b1"类型的消息,收到后,就可以进行相关的处理了 public PacketHeader(string packetTypeStr, long payloadPacketSize, string requestedReturnPacketTypeStr = null, bool receiveConfirmationRequired = false, string checkSumHash = null, bool includeConstructionTime = false) { longItems = new Dictionary<PacketHeaderLongItems, long>(); stringItems = new Dictionary<PacketHeaderStringItems, string>(); stringItems.Add(PacketHeaderStringItems.PacketType, packetTypeStr); longItems.Add(PacketHeaderLongItems.PayloadPacketSize, payloadPacketSize); if (payloadPacketSize < 0) throw new Exception("payloadPacketSize can not be less than 0."); if (requestedReturnPacketTypeStr != null) stringItems.Add(PacketHeaderStringItems.RequestedReturnPacketType, requestedReturnPacketTypeStr); if (receiveConfirmationRequired) stringItems.Add(PacketHeaderStringItems.ReceiveConfirmationRequired, ""); if (checkSumHash != null) stringItems.Add(PacketHeaderStringItems.CheckSumHash, checkSumHash); if (includeConstructionTime) longItems.Add(PacketHeaderLongItems.PacketCreationTime, DateTime.Now.Ticks); } internal PacketHeader(MemoryStream packetData, SendReceiveOptions sendReceiveOptions) { try { if (packetData == null) throw new ArgumentNullException("packetData", "Provided MemoryStream parameter cannot be null."); if (sendReceiveOptions == null) throw new ArgumentNullException("sendReceiveOptions", "Provided SendReceiveOptions parameter cannot be null."); if (packetData.Length == 0) throw new SerialisationException("Attempted to create packetHeader using 0 packetData bytes."); //创建数据包包头 PacketHeader tempObject = sendReceiveOptions.DataSerializer.DeserialiseDataObject<PacketHeader>(packetData, sendReceiveOptions.DataProcessors, sendReceiveOptions.Options); if (tempObject == null || !tempObject.longItems.ContainsKey(PacketHeaderLongItems.PayloadPacketSize) || !tempObject.stringItems.ContainsKey(PacketHeaderStringItems.PacketType)) throw new SerialisationException("Something went wrong when trying to deserialise the packet header object"); else { stringItems = new Dictionary<PacketHeaderStringItems, string>(); foreach (var pair in tempObject.stringItems) stringItems.Add(pair.Key, String.Copy(pair.Value)); longItems = new Dictionary<PacketHeaderLongItems, long>(); foreach (var pair in tempObject.longItems) longItems.Add(pair.Key, pair.Value); } } catch (Exception ex) { throw new SerialisationException("Error deserialising packetHeader. " + ex.ToString()); } } #region Get & Set /// <summary> /// 数据包的大小 /// </summary> public int PayloadPacketSize { get { return (int)longItems[PacketHeaderLongItems.PayloadPacketSize]; } //private set { longItems[PacketHeaderLongItems.PayloadPacketSize] = value; } } /// <summary> /// 数据包的类型 /// </summary> public string PacketType { get { return stringItems[PacketHeaderStringItems.PacketType]; } //private set { stringItems[PacketHeaderStringItems.PacketType] = value; } } //检查某个选项是否已被设定 public bool ContainsOption(PacketHeaderStringItems option) { return stringItems.ContainsKey(option); } //检查某个选项是否已被设定 public bool ContainsOption(PacketHeaderLongItems option) { return longItems.ContainsKey(option); }  //在英文网站上购买 九折折扣代码: NCDN_PRCLW

//淘宝正版销售 http://shop115882994.taobao.com/ 八折
public long GetOption(PacketHeaderLongItems option) { return longItems[option]; } public string GetOption(PacketHeaderStringItems options) { return stringItems[options]; } public void SetOption(PacketHeaderLongItems option, long Value) { longItems[option] = Value; } /// <summary> /// Set a string option with the provided value. /// </summary> /// <param name="option">The option to set</param> /// <param name="Value">The option value</param> public void SetOption(PacketHeaderStringItems option, string Value) { stringItems[option] = Value; } #endregion } http://www.cnblogs.com/networkcomms http://www.networkcoms.cn 编辑

 

【开源下载】基于TCP网络通信的即时聊天系统(IM系统)(c#源码)

[源码下载]Demo2.模拟简单登陆-效果图 基于networkcomms2.3.1

[源码下载]Demo1 客户端从服务器获取信息(基于networkcomms2.3.1)

【开源下载】基于TCP网络通信的自动升级程序c#源码

【模板下载】分享我所使用的数据库框架

【模板下载】innosetup 制作.net安装包的模板

 

【模板下载】分享我所使用的数据库框架

转载于:https://my.oschina.net/networkcomms/blog/382039

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值