Tool.Net 之 TcpFrame

本文主要概括

本文主要是讲述如何使用 TcpFrame 命名空间下的 类 实现高效安全稳定的 数据通讯,他的借鉴灵感来源于 Mvc 。

  1. 作者的想法,为什么不能把程序之间的 Tcp 通讯,变的更加简单了,类似于 访问指定类下面的指定接口的形式呢?
  2. 因为想法大胆实践,经过几轮大改小改,性能达到了接近极致。
  3. 为了保证足够的小,我对消息体进行量身定制,做到一个接口信息两个字节的最小标准。
  4. 那么一个项目最多可以写多少个接口呢?(255*255)个,也已经很惊人了。
  5. 当前采用什么模式了? 有问有答模式。
  6. 都能传输什么呢?(字符串,字节流)
  7. 通讯安全可靠吗?(协议绝对安全,目前考虑最多的是,对数据进行加密传输,有在考虑引入 中间件模式)

提示:以上的大概信息说明。


开始吧

第一步当然是如何使用啦!

一、创建通讯服务端

直接上示例

 ServerFrame server = new(108);//创建通讯服务
 
 server.SetCompleted((a, b, c) => // 创建相关事件
 {
      Console.WriteLine("IP:{0} \t{1} \t{2}", a, b, c.ToString("yyyy/MM/dd HH:mm:ss:fffffff"));
 });

 server.StartAsync("127.0.0.1", 444); //开启监听通讯。

二、创建通讯客户端

第一步当然是如何使用啦!
直接上示例

 ClientFrame client = new(Tool.Sockets.SupportCode.TcpBufferSize.Default, 108, true);//创建通讯客户端服务
 
 client.SetCompleted((a, b, c) => // 创建相关事件
 {
      Console.WriteLine("IP:{0} \t{1} \t{2}", a, b, c.ToString("yyyy/MM/dd HH:mm:ss:fffffff"));
 });

 client.ConnectAsync("127.0.0.1", 444); //连接服务通讯。
 client.AddKeepAlive(5); //特殊情况,可以附加心跳消息,服务器自动解析为心跳,包体小。

三、消息接收模型

这里介绍一个核心类 DataBase !
直接上示例

  public class Class1 : DataBase//继承实现该类,拥有直接被服务调度的能力。
  {
        [DataTcp(1)] // 主服务ID
        public Class1()//构造函数
        {

        }

        protected override bool Initialize(DataTcp dataTcp)// 默认入口。
        {
            return true;
        }

        [DataTcp(100)] // 子服务ID
        public IGoOut A(int a) 
        {
            return Json(new { a });
        }
        
		[DataTcp(101)] // 子服务ID
        public IGoOut B(string path)
        {
            byte[] s = System.IO.File.ReadAllBytes(path);
            return Write(s);
        }
        
		[DataTcp(102)]
        public IGoOut C(string path)
        {
            return Write("保存成功!");
        }
   }

这里明确一下,以上实现,客户端,服务端 通用,均生效。


四、发送数据流程

发送数据,不需要特意,整体操作简单易用。

// 这里为客户端向服务端发送数据,协议定义。
var data = new ApiPacket(1, 100, 100);
data.Set("a", 100);
var mag = client.Send(data);
// 返回数据对象,包含,数据结果。
Console.WriteLine("请求结果:{0},{1}", mag.Text, mag.OnTcpFrame);

// 这里为服务端向客户端发送数据,协议定义。
var data = new ApiPacket(1, 102, 100);
data.Set("path", "C://");
var mag = server.Send("当前连接的客户端地址", data);
// 返回数据对象,包含,数据结果。
Console.WriteLine("请求结果:{0},{1}", mag.Text, mag.OnTcpFrame);

//特殊函数 ClientFrame 类,拥有直接向当前已经连接服务器的其他客户端转发数据的能力,这样的好处是更快的执行效率。(示例)
// 这里为服务端向客户端发送数据,协议定义。
var data = new ApiPacket(1, 102, 100);
data.Set("path", "C://");
var mag = client.SendIpIdea("另一个已知客户端的地址", data);
// 返回数据对象,包含,数据结果。
Console.WriteLine("请求结果:{0},{1}", mag.Text, mag.OnTcpFrame);

//相同函数,均提供 SendAsync 异步函数。(示例)
var data = new ApiPacket(1, 100, 100);
data.Set("a", 100);
var mag = await client.SendAsync(data);
// 返回数据对象,包含,数据结果。
Console.WriteLine("请求结果:{0},{1}", mag.Text, mag.OnTcpFrame); 

总结

这么快就到了总结的环节了,很荣幸你能看到这里,本章大概介绍就到这里了。

作者考虑到两个方面的优化:

  1. 第一是压缩模块的引入
  2. 第二是加密模块的引入
  3. 更多改进,有待商榷。
  4. 如果大家在实际使用中,想到了什么更优想法,欢迎留言,或加群直接与我沟通。

版权声明:本文为qq_33484542原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。