您的位置:首页 > 理论基础 > 计算机网络

BeetleX快速构建多平台的TCP和SSL TCP应用

2019-04-22 11:00 429 查看

对于普通开发者而言编写TCP应用通讯是一件相对复杂的工作,毕竟需要一系列的bytes操作;如果再针对SSL的安全性处理相信会把很多普通开发者拒之门外.为了简化这一问题

BeetleX
引入了
Stream
操作模式并提供
PipiStream
操作对象让开发者在TCP流操作上变得非常简便;由于
PipiStream​
是基本saea扩展的流操作模型,因此在提供简便操作的同时还能提供出色的性能。以下介绍如何使用
BeetleX
构建TCP和基于SSL的TCP应用示例。

引用组件

使用组件可以通过Nuget引用组件,最新版本是

1.2.6.8

 

构建TCP服务

组件构建通讯应用非常简单,在引用组件后简单实现

IServerHandler
接口即可,以下是简单构建的服务代码:

class Program : BeetleX.ServerHandlerBase
{
private static BeetleX.IServer mServer;

static void Main(string[] args)
{
mServer = SocketFactory.CreateTcpServer<Program>();
mServer.Open();
Console.WriteLine(mServer.Status);
Console.Read();
}

protected override void OnLogToConsole(IServer server, ServerLogEventArgs e)
{

Console.WriteLine($"{DateTime.Now}\t{e.Type}\t{e.Session?.RemoteEndPoint} {e.Message}");
}

public override void SessionReceive(IServer server, SessionReceiveEventArgs e)
{
base.SessionReceive(server, e);
var stream = e.Stream.ToPipeStream();
if (stream.TryReadLine(out string line))
{
Console.WriteLine(line);
stream.WriteLine($"{DateTime.Now}");
e.Stream.Flush();
}
}
}

ServerHandlerBase
是组件内部实现
IServerHandler
接口,只需要简单重写
SessionReceive
事件来处理接收的数据可。以上代码是尝试从流中读取一行字符信息,如果读成功后显示内容并把当前时间输出给客户端。

构建TCP客户端

由于客户端和服务端使用同一套

Stream
实现体系,所以在客户端上也是使用同样的流模式操作即可.

var client = SocketFactory.CreateClient<Clients.TcpClient>("localhost", 9090);
client.Connect();
var stream = client.Stream.ToPipeStream();
while (true)
{
string value = Console.ReadLine();
stream.WriteLine($"{DateTime.Now} {value}");
client.Stream.Flush();
client.Receive();
if (stream.TryReadLine(out string line))
{
Console.WriteLine(line);
}
}

运行效果

 

SSL服务端

很多时候应用需要一个可靠安全的通讯机制,组件默认提供

SSL
的支持;只需要简单地配置一下
SSL
信息即可实现安全的
SSL
通讯。

class Program : BeetleX.ServerHandlerBase
{
private static BeetleX.IServer mServer;

static void Main(string[] args)
{
mServer = SocketFactory.CreateTcpServer<Program>();
mServer.Options.DefaultListen.SSL = true;
mServer.Options.DefaultListen.CertificateFile = "c:\\ikende.com.pfx";
mServer.Options.DefaultListen.CertificatePassword = "******";
mServer.Open();
Console.WriteLine(mServer.Status);
Console.Read();
}

protected override void OnLogToConsole(IServer server, ServerLogEventArgs e)
{

Console.WriteLine($"{DateTime.Now}\t{e.Type}\t{e.Session?.RemoteEndPoint} {e.Message}");
}

public override void SessionReceive(IServer server, SessionReceiveEventArgs e)
{
base.SessionReceive(server, e);
var stream = e.Stream.ToPipeStream();
if (stream.TryReadLine(out string line))
{
Console.WriteLine(line);
stream.WriteLine($"{DateTime.Now}");
e.Stream.Flush();
}
}
}

SSL客户端

class Program
{
static void Main(string[] args)
{
var client = SocketFactory.CreateSslClient<Clients.TcpClient>("localhost", 9090, "ikende.com");
client.Connect();
var stream = client.Stream.ToPipeStream();
while (true)
{
string value = Console.ReadLine();
stream.WriteLine($"{DateTime.Now} {value}");
client.Stream.Flush();
client.Receive();
if (stream.TryReadLine(out string line))
{
Console.WriteLine(line);
}
}
}
}

在创建客户端的SSL里需要指定证书对应的机构名称,用于进行SSL验证。

运行效果

组件在开启SSL服务的日志输出打印出详细的证书信息,用于方便查看SSL的启动状态

支持平台

组件支持2.1或更高版本的dorecore 和Standard2.0

https://ikende.com/Files/BeetleX.Samples.Echo.zip

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: