C#實(shí)現(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ù)包實(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ù)包)對象
/// </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ù)包實(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ò)通信共享庫NetShare的使用示例的文章就介紹到這了,更多相關(guān)C# 網(wǎng)絡(luò)共享NetShare內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#實(shí)現(xiàn)抓取和分析網(wǎng)頁類實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)抓取和分析網(wǎng)頁類,實(shí)例分析了C#抓取及分析網(wǎng)頁中文本及連接的相關(guān)使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-05-05
WPF實(shí)現(xiàn)環(huán)(圓)形菜單的示例代碼
這篇文章主要介紹了如何利用WPF繪制一個(gè)簡單的環(huán)形菜單,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)或工作有一定幫助,需要的可以參考一下2022-07-07
C#中使用IFormattable實(shí)現(xiàn)自定義格式化字符串輸出示例
這篇文章主要介紹了C#中使用IFormattable實(shí)現(xiàn)自定義格式字符串輸出示例,本文直接給出實(shí)例代碼,需要的朋友可以參考下2015-06-06
C#實(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-08
Unity實(shí)現(xiàn)移動物體到鼠標(biāo)點(diǎn)擊位置
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)移動物體到鼠標(biāo)點(diǎn)擊位置,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08

