使用BeetleX构建基础的SSL网络通讯
BeetleX的使用非常簡(jiǎn)單,通過Stream的數(shù)據(jù)流模式可以讓你輕松處理網(wǎng)絡(luò)數(shù)據(jù);在處理SSL加密通訊的時(shí)候組件的使用也是非常方便,只需要簡(jiǎn)單的配置證書即可完成基于SSL的網(wǎng)絡(luò)安全通訊,接下來介紹一下通過組件快速構(gòu)建一個(gè)安全可靠的網(wǎng)絡(luò)服務(wù)。
引用組件
組件的最新版本是1.4.9.6可以通過訪問?https://www.nuget.org/packages/BeetleX/?獲取最新版本,或直接通過Nuget進(jìn)行安全組件。
證書文件
構(gòu)建SSL服務(wù)需要一個(gè)pfx的證書文件,可以通過相關(guān)命令創(chuàng)建,如果不想麻煩可以通過vs在項(xiàng)目中簽名中添加一個(gè)即可創(chuàng)建一個(gè)pfx文件作為SSL服務(wù)的證書文件。
定義協(xié)議數(shù)據(jù)
任何網(wǎng)絡(luò)通訊都具有一個(gè)應(yīng)用協(xié)議,主要作用是根據(jù)網(wǎng)絡(luò)的字節(jié)流信息還原成具體可以操作的數(shù)據(jù)信息對(duì)象。組件通過IPacket接口來定義一個(gè)協(xié)議解釋器
public interface IPacket : IDisposable{EventHandler<PacketDecodeCompletedEventArgs> Completed { get; set; }IPacket Clone();void Decode(ISession session, Stream stream);void Encode(object data, ISession session, Stream stream);byte[] Encode(object data, IServer server);ArraySegment<byte> Encode(object data, IServer server, byte[] buffer);}這個(gè)接口主要用于描述協(xié)議編碼和解碼的工作,并提供一個(gè)委托來觸發(fā)消息解釋完成的回調(diào)。實(shí)現(xiàn)這個(gè)接口需要一些工作不過組件提供了一個(gè)基礎(chǔ)的協(xié)議封包類FixedHeaderPacket,主要用于解決頭大小描述的消息體;接下來定義一個(gè)簡(jiǎn)單的String消息協(xié)議處理器
public class StringPacket : BeetleX.Packets.FixedHeaderPacket{public override IPacket Clone(){return new StringPacket();}protected override object OnRead(ISession session, PipeStream stream){return stream.ReadString(CurrentSize);}protected override void OnWrite(ISession session, object data, PipeStream stream){stream.Write((string)data);}}通過重寫OnRead和OnWrite兩個(gè)方法來處理封包和解包的工作。這個(gè)協(xié)議解釋器的具體協(xié)議格如下:?|payload size|payload|
構(gòu)建服務(wù)
有了協(xié)議分析類接下來的工作就可以實(shí)現(xiàn)一個(gè)基于String傳遞的網(wǎng)絡(luò)服務(wù)
class Program : ServerHandlerBase{private static IServer server;public static void Main(string[] args){server = SocketFactory.CreateTcpServer<Program,StringPacket>();server.Options.DefaultListen.SSL = true;server.Options.DefaultListen.CertificateFile = "test.pfx";server.Options.DefaultListen.CertificatePassword = "123456";server.Options.LogLevel = LogType.Info;server.Open();Console.Read();}protected override void OnReceiveMessage(IServer server, ISession session, object message){Console.WriteLine(message);server.Send($"hello {message}", session);}}可以通過SocketFactory.CreateTcpServer方法來構(gòu)建一個(gè)TCP服務(wù),方法需要帶上接受網(wǎng)絡(luò)處理事件的IServerHandler和一個(gè)協(xié)議解釋對(duì)象IPacket.以上服務(wù)是重寫OnReceiveMessage方法接收請(qǐng)求的消息處理并返回;IServerHandler除也可以定義接收消息外還提供其他方法實(shí)現(xiàn)用于監(jiān)控連接的不同事件處理,詳細(xì)下如:
public interface IServerHandler{void Connected(IServer server, ConnectedEventArgs e);void Connecting(IServer server, ConnectingEventArgs e);void Disconnect(IServer server, SessionEventArgs e);void Error(IServer server, ServerErrorEventArgs e);void Log(IServer server, ServerLogEventArgs e);void SessionDetection(IServer server, SessionDetectionEventArgs e);void SessionPacketDecodeCompleted(IServer server, PacketDecodeCompletedEventArgs e);void SessionReceive(IServer server, SessionReceiveEventArgs e);}SSL配置
在打開服務(wù)端可以通過server.Options來配置相應(yīng)的SSL,主要配置如下:
server.Options.DefaultListen.SSL = true;server.Options.DefaultListen.CertificateFile = "test.pfx";server.Options.DefaultListen.CertificatePassword = "123456";通過以上配置就可以啟用一個(gè)SSL服務(wù),啟動(dòng)服務(wù)后可以看到服務(wù)的詳細(xì)信息
客戶端訪問
組件同樣提供相應(yīng)的客戶端類來訪問相關(guān)服務(wù),不過在訪問服務(wù)的時(shí)候同樣需要定義一個(gè)協(xié)議解釋器
public class StringPacket : BeetleX.Packets.FixeHeaderClientPacket{public override IClientPacket Clone(){return new StringPacket();}protected override object OnRead(IClient client, PipeStream stream){return stream.ReadString(CurrentSize);}protected override void OnWrite(object data, IClient client, PipeStream stream){stream.Write((string)data);}}定義協(xié)議解釋器后,就可以創(chuàng)建一個(gè)訪問對(duì)象了;組件提供幾個(gè)客戶端訪問類分別是:TcpClien同步,AsyncTcpClient異步和AwaiterClient支持await。接下來通過AwaiterClient來訪問服務(wù):
AwaiterClient client = new AwaiterClient("127.0.0.1", 9090, new StringPacket(), "test");client.CertificateValidationCallback = (s, e, c, p) => true;while (true){Console.Write("Enter Name:");var line = Console.ReadLine();client.Send(line);var result = await client.Receive();Console.WriteLine($"{DateTime.Now} {result}");}在使用SSL時(shí)很多時(shí)候可以因?yàn)榉?wù)名導(dǎo)致無法通過驗(yàn)證,所以可以通過定義CertificateValidationCallback返回True來忽略相關(guān)驗(yàn)證.這樣一個(gè)基于SSL訪問的網(wǎng)絡(luò)程序就完成,最后可以通過服務(wù)端的日志查看相關(guān)工作情況:
總結(jié)
以上是生活随笔為你收集整理的使用BeetleX构建基础的SSL网络通讯的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET Core开发实战(第6课:作用
- 下一篇: 小cookie,大智慧