使用BeetleX构建基础的SSL网络通讯
BeetleX的使用非常簡單,通過Stream的數據流模式可以讓你輕松處理網絡數據;在處理SSL加密通訊的時候組件的使用也是非常方便,只需要簡單的配置證書即可完成基于SSL的網絡安全通訊,接下來介紹一下通過組件快速構建一個安全可靠的網絡服務。
引用組件
組件的最新版本是1.4.9.6可以通過訪問?https://www.nuget.org/packages/BeetleX/?獲取最新版本,或直接通過Nuget進行安全組件。
證書文件
構建SSL服務需要一個pfx的證書文件,可以通過相關命令創建,如果不想麻煩可以通過vs在項目中簽名中添加一個即可創建一個pfx文件作為SSL服務的證書文件。
定義協議數據
任何網絡通訊都具有一個應用協議,主要作用是根據網絡的字節流信息還原成具體可以操作的數據信息對象。組件通過IPacket接口來定義一個協議解釋器
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);}這個接口主要用于描述協議編碼和解碼的工作,并提供一個委托來觸發消息解釋完成的回調。實現這個接口需要一些工作不過組件提供了一個基礎的協議封包類FixedHeaderPacket,主要用于解決頭大小描述的消息體;接下來定義一個簡單的String消息協議處理器
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兩個方法來處理封包和解包的工作。這個協議解釋器的具體協議格如下:?|payload size|payload|
構建服務
有了協議分析類接下來的工作就可以實現一個基于String傳遞的網絡服務
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方法來構建一個TCP服務,方法需要帶上接受網絡處理事件的IServerHandler和一個協議解釋對象IPacket.以上服務是重寫OnReceiveMessage方法接收請求的消息處理并返回;IServerHandler除也可以定義接收消息外還提供其他方法實現用于監控連接的不同事件處理,詳細下如:
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配置
在打開服務端可以通過server.Options來配置相應的SSL,主要配置如下:
server.Options.DefaultListen.SSL = true;server.Options.DefaultListen.CertificateFile = "test.pfx";server.Options.DefaultListen.CertificatePassword = "123456";通過以上配置就可以啟用一個SSL服務,啟動服務后可以看到服務的詳細信息
客戶端訪問
組件同樣提供相應的客戶端類來訪問相關服務,不過在訪問服務的時候同樣需要定義一個協議解釋器
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);}}定義協議解釋器后,就可以創建一個訪問對象了;組件提供幾個客戶端訪問類分別是:TcpClien同步,AsyncTcpClient異步和AwaiterClient支持await。接下來通過AwaiterClient來訪問服務:
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時很多時候可以因為服務名導致無法通過驗證,所以可以通過定義CertificateValidationCallback返回True來忽略相關驗證.這樣一個基于SSL訪問的網絡程序就完成,最后可以通過服務端的日志查看相關工作情況:
總結
以上是生活随笔為你收集整理的使用BeetleX构建基础的SSL网络通讯的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET Core开发实战(第6课:作用
- 下一篇: 小cookie,大智慧