C#實現(xiàn)網(wǎng)絡(luò)通信共享庫NetShare的使用示例
前言
網(wǎng)絡(luò)通信共享庫NetShare用于保證客戶端與服務(wù)器通信數(shù)據(jù)包的規(guī)范和統(tǒng)一,客戶端與服務(wù)器共同使用本庫,提升數(shù)據(jù)包序列化和反序列化的準(zhǔn)確性和安全性,并且用于滿足不同的通信數(shù)據(jù)需求。
NetShare:DataPacket(通用數(shù)據(jù)包)
using System; using System.IO; using System.Runtime.Serialization; namespace NetShare { /// <summary> /// 通用數(shù)據(jù)包 /// </summary> [KnownType(typeof(PCDataPacket)), KnownType(typeof(PSDataPacket)), KnownType(typeof(ServerDataPacket))] [DataContract] public class DataPacket { /// <summary> /// 當(dāng)前數(shù)據(jù)發(fā)送端的IPEndPoint字符串內(nèi)容(ip地址:端口號) /// </summary> [DataMember] public string mLocalEndPointStr; /// <summary> /// 當(dāng)前數(shù)據(jù)發(fā)送端發(fā)送的其它內(nèi)容 /// </summary> [DataMember] public string mContent; /// <summary> /// 將當(dāng)前數(shù)據(jù)包實例轉(zhuǎn)換為字節(jié)數(shù)組 /// </summary> /// <returns>字節(jié)數(shù)組</returns> public virtual byte[] ToBytes() { return Array.Empty<byte>(); } /// <summary> /// 將指定的字節(jié)數(shù)組轉(zhuǎn)換為DataPacket(數(shù)據(jù)包)對象 /// </summary> /// <param name="bytes">指定的字節(jié)數(shù)組</param> /// <param name="type">DataPacket派生類類型</param> /// <returns>DataPacket(數(shù)據(jù)包)對象或null</returns> public static DataPacket ToObject(byte[] bytes, Type type) { if (bytes?.Length > 0 && type != null && type.IsAssignableFrom(typeof(DataPacket))) { using (MemoryStream ms = new MemoryStream(bytes)) { DataContractSerializer serializer = new DataContractSerializer(type); object obj = serializer.ReadObject(ms); if (obj != null && obj.GetType().Equals(type)) return (DataPacket)obj; }; } return null; } /// <summary> /// 將指定的字節(jié)數(shù)組轉(zhuǎn)換為DataPacket派生類(數(shù)據(jù)包)對象 /// </summary> /// <typeparam name="T">DataPacket派生類類型</typeparam> /// <param name="bytes">指定的字節(jié)數(shù)組</param> /// <returns>DataPacket派生類(數(shù)據(jù)包)對象或null</returns> public static T ToObject<T>(byte[] bytes) where T : DataPacket { if (bytes?.Length > 0) { using (MemoryStream ms = new MemoryStream(bytes)) { DataContractSerializer serializer = new DataContractSerializer(typeof(T)); object obj = serializer.ReadObject(ms); if (obj != null && obj is T t) return t; }; } return null; } } }
NetShare:ClientDataPacket(客戶端數(shù)據(jù)包)
using System.Runtime.Serialization; using System.IO; namespace NetShare { /// <summary> /// 客戶端數(shù)據(jù)包 /// </summary> [DataContract] public class ClientDataPacket : DataPacket { /// <summary> /// 當(dāng)前客戶端的名稱 /// </summary> [DataMember] public string mClientName; /// <summary> /// 構(gòu)造函數(shù) /// </summary> public ClientDataPacket() { mLocalEndPointStr = string.Empty; mContent = string.Empty; mClientName = string.Empty; } /// <summary> /// 將客戶端數(shù)據(jù)包實例轉(zhuǎn)換為字節(jié)數(shù)組 /// </summary> /// <returns>字節(jié)數(shù)組</returns> public override byte[] ToBytes() { using (MemoryStream ms = new MemoryStream()) { DataContractSerializer serializer = new DataContractSerializer(typeof(ClientDataPacket)); serializer.WriteObject(ms, this); return ms.ToArray(); } } /// <summary> /// 客戶端數(shù)據(jù)包的字符串內(nèi)容 /// </summary> /// <returns>字符串內(nèi)容</returns> public override string ToString() { return $"[LocalEndPointStr:{mLocalEndPointStr},ClientName:{mClientName},Content:{mContent}]"; } } }
NetShare:ServerDataPacket(服務(wù)器數(shù)據(jù)包)
using System.IO; using System.Runtime.Serialization; namespace NetShare { /// <summary> /// 服務(wù)端數(shù)據(jù)包 /// </summary> [DataContract] public class ServerDataPacket : DataPacket { /// <summary> /// 構(gòu)造函數(shù) /// </summary> public ServerDataPacket() { mLocalEndPointStr = string.Empty; mContent = string.Empty; } /// <summary> /// 將服務(wù)端數(shù)據(jù)包實例轉(zhuǎn)換為字節(jié)數(shù)組 /// </summary> /// <returns>字節(jié)數(shù)組</returns> public override byte[] ToBytes() { using (MemoryStream ms = new MemoryStream()) { DataContractSerializer serializer = new DataContractSerializer(typeof(ServerDataPacket)); serializer.WriteObject(ms, this); return ms.ToArray(); } } /// <summary> /// 服務(wù)端數(shù)據(jù)包的字符串內(nèi)容 /// </summary> /// <returns>字符串內(nèi)容</returns> public override string ToString() { return $"[LocalEndPointStr:{mLocalEndPointStr},Content:{mContent}]"; } } }
NetShare:PCDataPacket(私聊頻道客戶端數(shù)據(jù)包)
using System.IO; using System.Runtime.Serialization; namespace NetShare { /// <summary> /// 私聊頻道客戶端數(shù)據(jù)包 /// </summary> [DataContract] public class PCDataPacket : ClientDataPacket { /// <summary> /// 目標(biāo)客戶端的名稱 /// </summary> [DataMember] public string mDestinationClientName; /// <summary> /// 構(gòu)造函數(shù) /// </summary> public PCDataPacket() { mDestinationClientName = string.Empty; } /// <summary> /// 將私聊頻道客戶端數(shù)據(jù)包實例轉(zhuǎn)換為字節(jié)數(shù)組 /// </summary> /// <returns>字節(jié)數(shù)組</returns> public override byte[] ToBytes() { using (MemoryStream ms = new MemoryStream()) { DataContractSerializer serializer = new DataContractSerializer(typeof(PCDataPacket)); serializer.WriteObject(ms, this); return ms.ToArray(); } } } }
NetShare:PSDataPacket(私聊頻道服務(wù)器數(shù)據(jù)包)
using System; using System.IO; using System.Runtime.Serialization; namespace NetShare { /// <summary> /// 私聊頻道服務(wù)端數(shù)據(jù)包 /// </summary> [DataContract] public class PSDataPacket : ServerDataPacket { /// <summary> /// 已與服務(wù)器進(jìn)行連接的客戶端名稱合集 /// </summary> [DataMember] public string[] mClientNames; /// <summary> /// 構(gòu)造函數(shù) /// </summary> public PSDataPacket() { mClientNames = Array.Empty<string>(); } /// <summary> /// 將私聊頻道服務(wù)端數(shù)據(jù)包實例轉(zhuǎn)換為字節(jié)數(shù)組 /// </summary> /// <returns>字節(jié)數(shù)組</returns> public override byte[] ToBytes() { using (MemoryStream ms = new MemoryStream()) { DataContractSerializer serializer = new DataContractSerializer(typeof(PSDataPacket)); serializer.WriteObject(ms, this); return ms.ToArray(); } } } }
到此這篇關(guān)于C#實現(xiàn)網(wǎng)絡(luò)通信共享庫NetShare的使用示例的文章就介紹到這了,更多相關(guān)C# 網(wǎng)絡(luò)共享NetShare內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#中使用IFormattable實現(xiàn)自定義格式化字符串輸出示例
這篇文章主要介紹了C#中使用IFormattable實現(xiàn)自定義格式字符串輸出示例,本文直接給出實例代碼,需要的朋友可以參考下2015-06-06C#實現(xiàn)將數(shù)據(jù)導(dǎo)出到word或者Excel中的方法
這篇文章主要介紹了C#實現(xiàn)將數(shù)據(jù)導(dǎo)出到word或者Excel中的方法,涉及C#操作word及Excel格式文件的方法,具有一定參考借鑒價值,需要的朋友可以參考下2015-08-08Unity實現(xiàn)移動物體到鼠標(biāo)點(diǎn)擊位置
這篇文章主要為大家詳細(xì)介紹了Unity實現(xiàn)移動物體到鼠標(biāo)點(diǎn)擊位置,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-08-08