本文主要概括
本文主要是讲述如何使用 TcpFrame 命名空间下的 类 实现高效安全稳定的 数据通讯,他的借鉴灵感来源于 Mvc 。
- 作者的想法,为什么不能把程序之间的 Tcp 通讯,变的更加简单了,类似于 访问指定类下面的指定接口的形式呢?
- 因为想法大胆实践,经过几轮大改小改,性能达到了接近极致。
- 为了保证足够的小,我对消息体进行量身定制,做到一个接口信息两个字节的最小标准。
- 那么一个项目最多可以写多少个接口呢?(255*255)个,也已经很惊人了。
- 当前采用什么模式了? 有问有答模式。
- 都能传输什么呢?(字符串,字节流)
- 通讯安全可靠吗?(协议绝对安全,目前考虑最多的是,对数据进行加密传输,有在考虑引入 中间件模式)
提示:以上的大概信息说明。
开始吧
第一步当然是如何使用啦!
一、创建通讯服务端
直接上示例
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);
总结
这么快就到了总结的环节了,很荣幸你能看到这里,本章大概介绍就到这里了。作者考虑到两个方面的优化:
- 第一是压缩模块的引入
- 第二是加密模块的引入
- 更多改进,有待商榷。
- 如果大家在实际使用中,想到了什么更优想法,欢迎留言,或加群直接与我沟通。
版权声明:本文为qq_33484542原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。