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
访问的网络程序就完成,最后可以通过服务端的日志查看相关工作情况: