TCP和SSL TCP应用

对于普通开发者而言编写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


专注dotnet core 服务应用技术研发

什么时候使用BeetleX.FastHttpApi

  • 当你需要一个高性能的webapi服务的时候,因为它具有asp.net core mvc的简便使用特性的同时提升了200%或更高的性能。
  • 当你希望接口同时支持http和websocket,组件支持一个逻辑控制器同时提供http和websocket两种服务,即一份代码即可服务http和websocket请求
  • 当你需要一个嵌入的HTTP服务应用,组件支持netstandard2.0,可以灵活地在winform或wpf中集成一个可靠的HTTP服务。

TCP和SSL TCP应用的更多相关文章

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

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

  2. TCP和SSL

    查看TCP和SSL的握手时间: curl -w "TCP handshake: %{time_connect}, SSL handshake: %{time_appconnect}\n&qu ...

  3. 开源基于asio的网络通信框架asio2,支持TCP,UDP,HTTP,RPC,SSL,跨平台,支持可靠UDP,支持TCP自动拆包,TCP数据报模式等

    开源基于asio的网络通信框架asio2,支持TCP,UDP,HTTP,RPC,SSL,跨平台,支持可靠UDP,支持TCP自动拆包,TCP数据报模式等 C++开发网络通信程序时用asio是个不错的选择 ...

  4. 【Linux】【Web】【HTTP】HTTP,TCP,SSL通讯过程

    1. HTTP 一次完整的http请求处理过程: (1) 建立或处理连接:接收请求或拒绝请求(三次握手): (2) 接收请求:接收来自于网络上的主机请求报文中对某特定资源的一次请求的过程: (3) 处 ...

  5. OGG-01232 Receive TCP params error: TCP/IP error 104 (Connection reset by peer), endpoint:

    源端: 2015-02-05 17:45:49 INFO OGG-01815 Virtual Memory Facilities for: COM anon alloc: mmap(MAP_ANON) ...

  6. TCP/IP之TCP的建立与终止

    TCP协议简介 tcp/ip协议族中传输层最重要的两种协议是UDP和TCP协议,上一篇文章用很短的篇幅介绍完了UDP协议相关的内容,但相对于UDP而言的TCP协议,是种更复杂,应用更广的协议.在接下来 ...

  7. TCP/IP 笔记 - TCP保活机制

    TCP协议中不存在轮询机制,这意味着加入启动一个客户端进程,与服务器建立连接后,然后离开几小时.几天.甚至几个月,连接依然会保持着.理论上,中间路由器可以崩溃和重启,数据线可以断开再连接,只要连接两端 ...

  8. TCP/IP 笔记 - TCP拥塞控制

    拥塞控制是TCP通信的每一方需要执行的一系列行为,这些行为有特定算法规定,用于防止网络因为大规模的通信负载而瘫痪.其基本方法是当有理由认为网络即将进入拥塞状态(或已由于拥塞而出现路由丢包情况)时减缓T ...

  9. TCP/IP 笔记 - TCP数据流和窗口管理

    TCP流量控制机制通过动态调整窗口大小来控制发送端的操作,确保路由器/接收端消息不会溢出. 交互式TCP连接 交互式TCP连接指该连接需要在客户端和服务器之间传输用户输入信息,如按键操作.短消息.操作 ...

随机推荐

  1. Spring Boot 中初始化资源的几种方式(转)

    假设有这么一个需求,要求在项目启动过程中,完成线程池的初始化,加密证书加载等功能,你会怎么做?如果没想好答案,请接着往下看.今天介绍几种在Spring Boot中进行资源初始化的方式,帮助大家解决和回 ...

  2. Confluence 6.15 修改历史(Change-History)宏

    修改历史(Change-History)宏显示了页面一个的更新历史:版本号,作者,日期和备注.这些内容将会在同一栏中进行显示. 屏幕截图:Confluence 中的修改历史(Change-Histor ...

  3. rabbitmq 的安装配置使用

    前言: 对于消息队列中间件: #redis: 功能比较全,但是如果突然停止运行或断电会造成数据丢失 #RabbitMQ:功能比较齐全.稳定.便于安装,在生产环境来说是首选的 1.下载软件[下载较慢,请 ...

  4. Parallels Desktop 安装centos7

    配置网卡: vi /etc/sysconfig/network-scripts/ifcfg-eth0 修改BOOTPROTO=dhcp,ONBOOT=yes. 保存后重启网卡 service netw ...

  5. 19.Python转义字符及用法

    在前面的章节中,我们曾经简单学习过转义字符,所谓转义,可以理解为“采用某些方式暂时取消该字符本来的含义”,这里的“某种方式”指的就是在指定字符前添加反斜杠 \,以此来表示对该字符进行转义. 举个例子, ...

  6. [笔记]共享内存(shm)

    一.特点 共享内存允许多个不同的进程可以访问同一块内存.相较于其他IPC形式,具有速度快,效率高的特点,共享内存的存在降低了在大规模数据处理过程中内存的消耗. 二.创建共享内存 1.头文件 #incl ...

  7. springboot 项目部署后 404的问题

    是因为打包的时候,没有把webapp打包进去 pom.xml 在build 里加入下面的依赖即可 <!-- resources插件,在打jar包时可以将webapp目录下的文件进行打包 --&g ...

  8. MySql 时区错误

    mysql的时区错误问题: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one ...

  9. 编写可维护的JavaScript代码(部分)

    平时使用的时VS来进行代码的书写,VS会自动的将代码格式化,所有写了这么久的JS代码,也没有注意到这些点.看了<编写可维护的javascript代码>之后,做了些笔记. var resul ...

  10. 自定义有焦点的TextView实现广告信息左右一直滚动的跑马灯效果

    import android.content.Context; import android.text.TextUtils; import android.util.AttributeSet; imp ...