C#實(shí)現(xiàn)網(wǎng)絡(luò)通信共享庫(kù)NetShare的使用示例
前言
網(wǎng)絡(luò)通信共享庫(kù)NetShare用于保證客戶端與服務(wù)器通信數(shù)據(jù)包的規(guī)范和統(tǒng)一,客戶端與服務(wù)器共同使用本庫(kù),提升數(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地址:端口號(hào)) /// </summary> [DataMember] public string mLocalEndPointStr; /// <summary> /// 當(dāng)前數(shù)據(jù)發(fā)送端發(fā)送的其它內(nèi)容 /// </summary> [DataMember] public string mContent; /// <summary> /// 將當(dāng)前數(shù)據(jù)包實(shí)例轉(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ù)包)對(duì)象 /// </summary> /// <param name="bytes">指定的字節(jié)數(shù)組</param> /// <param name="type">DataPacket派生類類型</param> /// <returns>DataPacket(數(shù)據(jù)包)對(duì)象或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ù)包)對(duì)象 /// </summary> /// <typeparam name="T">DataPacket派生類類型</typeparam> /// <param name="bytes">指定的字節(jié)數(shù)組</param> /// <returns>DataPacket派生類(數(shù)據(jù)包)對(duì)象或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ù)包實(shí)例轉(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ù)包實(shí)例轉(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ù)包實(shí)例轉(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ù)包實(shí)例轉(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#實(shí)現(xiàn)網(wǎng)絡(luò)通信共享庫(kù)NetShare的使用示例的文章就介紹到這了,更多相關(guān)C# 網(wǎng)絡(luò)共享NetShare內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#實(shí)現(xiàn)抓取和分析網(wǎng)頁(yè)類實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)抓取和分析網(wǎng)頁(yè)類,實(shí)例分析了C#抓取及分析網(wǎng)頁(yè)中文本及連接的相關(guān)使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-05-05WPF實(shí)現(xiàn)環(huán)(圓)形菜單的示例代碼
這篇文章主要介紹了如何利用WPF繪制一個(gè)簡(jiǎn)單的環(huán)形菜單,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定幫助,需要的可以參考一下2022-07-07C#中使用IFormattable實(shí)現(xiàn)自定義格式化字符串輸出示例
這篇文章主要介紹了C#中使用IFormattable實(shí)現(xiàn)自定義格式字符串輸出示例,本文直接給出實(shí)例代碼,需要的朋友可以參考下2015-06-06C#實(shí)現(xiàn)將數(shù)據(jù)導(dǎo)出到word或者Excel中的方法
這篇文章主要介紹了C#實(shí)現(xiàn)將數(shù)據(jù)導(dǎo)出到word或者Excel中的方法,涉及C#操作word及Excel格式文件的方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08Unity實(shí)現(xiàn)移動(dòng)物體到鼠標(biāo)點(diǎn)擊位置
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)移動(dòng)物體到鼠標(biāo)點(diǎn)擊位置,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08