【.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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值