.net socket 网络消息服务框架
简介
1.他是一个可以快速上手开发网络服务的框。你可以创建客户端,服务器。默认实现了一个简单的协议有数据包头,包尾消息编号,简单的校验,消息编号。系统根据协议解析消息出来编号,然后根据消息编号找到对应的消息处理方法。
创建大量创建大量对象,是一件比较费劲的事情,有的时候还必须解决创建对象的依赖,因此框架 自 带了一个小的 容用来帮助开发者解决创建对象的一写问题。支持单例和瞬时生命周期创建对象;支持单接口多实现;支持属性注入;需要注册的容器太多,有的时候也会显得有些麻烦,框架提供了组件,可以实现一个组件加载器,帮助你完成注册工作。服务在启动的时候默认会扫描所有的类,组件加载器,筛选出符合你的要求的类,然后你可以按照你的需要完成注册。
项目地址:https://gitee.com/sim-_-ple/simple-net.git
快速使用
1.创建一个服务定时给所有客户端发送一条消息
2.基础环境.net 6
3.创建一个控制台项目选择 net 6 名称TestService ,这里先完成服务端的部分
4.引用nuget 包simple-net ,地址 https://www.nuget.org/packages/simple-net
ISimpleBuilder host = SimpleBuilder.BuilderHost().Regster((container) =>
{
}).
ConfigutionLogger((logerProvide) =>
{
#region 日志模块配置
if (SimpleCheck.IsDebug())
{
logerProvide.CurrentLogLevel = LogLevel.Trace; //大于debug 等级日志将会被打印
}
else
{
logerProvide.CurrentLogLevel = LogLevel.Information; //大于debug 等级日志将会被打印
}
logerProvide.IsConsoleWrite = true;
logerProvide.RollingInterval = Simple.Framework.Logger.eRollingInterval.Day;//每天创建一份日志文件
logerProvide.ProfixLogFile = "service";//日志文件名称前缀
logerProvide.LogFolderPath = "log";//日志文件夹相对路径
#endregion
})
.StartPrettyServer();
Console.ReadLine();
5.创建配服务端置文件Configuration.json
{
"Kernel": {
"IpAddress": "localhost",
"SocketType": 1,
"ProtocolType": 6,
"Port": 8080,
"Backlog": 200,
"IsDebug": true,
"EncoderType": 2
}
}
6.创建一个任务 TestSchedule,通过容器拿到服务端所有客户端的连接,然后发送消息给客户端
internal class TestSchedule: BaseSchedule
{
[Autowired]
public IContainer container { get; set; }
[Autowired]
public IClientManager clientManager { get; set; }
/// <summary>
///
/// </summary>
public TestSchedule() {
ScheduleInfo.IsAsync=true;
ScheduleInfo.SetWholeTime(1,10);
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public override async Task RunAsync()
{
try
{
logger.LogInformation("threadcount:" + ThreadPool.ThreadCount);
clientManager = container.GetService<IClientManager>();
if (!SimpleCheck.IsNull(clientManager))
{
var clients = clientManager.GetClients();
logger.LogInformation(clients.Count().ToString());
foreach (var item in clients)
{
item.Context.Send(new TestMessage() { Msg = "test" }) ;
}
}
}
catch (Exception ex)
{
logger.LogError(ex.Message);
logger.LogError(ex.StackTrace);
}
}
}
7.同样的步骤在创建可以控制太项目,作为客户端testClient 选择.net 6
8.再创建一个公共的程序类库 common
这里可以创建一下消息传输对象继续baseStrignMessage就好了,发送的时候给一个默认的消息编号
public class TestMessage : BaseStringMessage
{
public TestMessage()
{
No = 0x10;
}
//根据你的业务自己定义数据字段,我这里就是测试,所以简单创建一个字段
public string Msg { get; set; }
}
这里是我测试的时候的项目结构,也是gitee仓库上面的测试项目,克隆之后可以直接启动看效果,定时任务每隔10秒向连接的客户端发送消息,客户端这边收到消息执行业务处理方法。
7.再创9.客户端的的代码,这里其实和服务端的代码非常相似,最后创建的时候是启动客户端,然后返回一个客户端的连接
var client = SimpleBuilder.BuilderHost().Regster((container) =>
{
var cfg=container.GetService<ClientConfiguration>();
}).
ConfigutionLogger((logerProvide) =>
{
#region 日志模块配置
if (SimpleCheck.IsDebug())
{
logerProvide.CurrentLogLevel = LogLevel.Trace; //大于debug 等级日志将会被打印
}
else
{
logerProvide.CurrentLogLevel = LogLevel.Information; //大于debug 等级日志将会被打印
}
logerProvide.IsConsoleWrite = true;
logerProvide.RollingInterval = Simple.Framework.Logger.eRollingInterval.Day;//每天创建一份日志文件
logerProvide.ProfixLogFile = "service";//日志文件名称前缀
logerProvide.LogFolderPath = "log";//日志文件夹相对路径
#endregion
})
.StartPrettyClient();
///这里可以发送消息给服务端,服务端如果想接收,还得创建消息处理类,可以把客户端的复制过去,记得要改成和服务端一样的命名空间
client.Send(new TestMessage() { No=0x10,Msg="msg"});
Console.ReadLine();
10.到这里其实已经完成,先生成服务端,然后找到bin点击exe文件启动,启动成功之后在启动客户端连接,这时候你就可以看到服务端给客户端定时发送消息了。
框架自带的一个简单的协议
1.收到数据后会验证包头包尾,校验位的如果其中一个不符合要求,将会把收到的数据丢弃
head 0x12 0x10 2字节
ext 0x12 1字节
data len 0x1a 4字节
data No 0x1a 4字节,消息编号
data ..... message序列化然后转换为byte
data crc 0x 1字节,校验位
tail 0x02 0x01 2字节
2.当然用户也可以自己定义协议
/// <summary>
/// 将收到的数据解析成符合要求的数据包,然后放到消息队列里面去
/// </summary>
/// <param name="context"></param>
public void AnalysisHandle(BlockingCollection<IDataPack> qdataPacks, byte[] data, int length);
/// <summary>
/// 这里完成你要如何处理消息
/// </summary>
/// <param name="context"></param>
public void Handle(IContext context);
//这里可以完成你处理消息之后需要做什么事情
public void Handled(IContext context);
/// <summary>
/// 这里完成把收到的数据解析,放到dataPack中,如果过你需要别的dataPack类型,也需要重重新定义自己的dataPackl,,然后注册到容器即可
/// </summary>
/// <param name="dataPack"></param>
public bool SetDataPack(IDataPack dataPack);
创建的时候调用这个方法完成注册,客户端与服务端需要保持一致的协议,否则数据无法正常解析,导致将收到的数据都丢弃
.ConfigutionMessageHandle<MyMessageHandle>()
内置一个简单的容器
内置一个小的容器,主要处理项目中对象的构造目前支持单例和瞬时剩生命周期。在初始化的时候开发者可以注册自己的对象和接口。
1.支持瞬时生命周期,单例生命周期
2.单接口多实现
3.构造函数注入,属性注入
工作的流程
1.客户端连接服务器,测试例子就没有做一些安全验证,比如连接之后发送一个登录包,长时间没有将会移除连接
2.服务端统一管理连接过来的客户端
3.客户端给服务端发送消息,服务端连接先解析消息根据定义好的协议成数据包,然后添加到数据包队列,另一边则是等待消息队列中有消息,有了就取出来解析好的消息,根据命令编号找出处理该消息的消息组件。到这里整个步骤就完成了!
项目地址:https://gitee.com/sim-_-ple/simple-net.git
nuget地址:https://www.nuget.org/packages/simple-net