介绍,介绍我的底层支持库 Net.Sz.CFramework
Net.Sz.CFramework 是我自己的底层库,是经过验证的底层库。
包含:
socket tcp协议,socket http协议线程池,线程模型,任务模型,定时器模型,日志模块脚本模块一些辅助类
接下来一一介绍
这里是华丽丽的分割线
辅助类功能块
// 摘要: // 获取当前时间和 1970-01-01 00:00:00 的时间差 // 为了和java一致使用的是 UTC 时间 public static long CurrentTimeMillis(); // // 摘要: // 获取当前时间所表示的毫秒数 public static long CurrentTimeMillis(DateTime dt); public static long CurrentTimeMillis_Java(); // // 摘要: // 获取当前时间所表示的毫秒数 public static long CurrentTimeMillis_Java(DateTime dt); // // 摘要: // 将毫秒数转化成当前时间 public static DateTime DateNow(long milliseconds); public static DateTime DateNow_Java(long milliseconds); // // 摘要: // yyyy-MM-dd HH:mm:ss:fff: // // 参数: // d: public static string NowString(DateTime d);
后面java函数是输出和java一直的时间函数
// // 摘要: // 验证活动是否结束 验证时间:[*][*][20/22][*][10:00-11:59/16:00-17:59] // 第一个是年,,第二个是月,第三个是日期,第四个是星期,第五个是时间, // 每一个参数,"-" 表示 到 如:“2015-2017”表示 2015 到 2017, "/" 表示 或者 如: “2015/2017”表示2015 // 或者 2017 public static bool VerifyConfigEndTimeStr(DateTime date, string timeStr); // // 摘要: // 获取活动结束时间倒计时 验证时间:[*][*][20/22][*][10:00-11:59/16:00-17:59] // 第一个是年,,第二个是月,第三个是日期,第四个是星期,第五个是时间, // 每一个参数,"-" 表示 到 如:“2015-2017”表示 2015 到 2017, "/" 表示 或者 如: “2015/2017”表示2015 // 或者 2017 // 返回值 -1 表示永久过期,0 表示在时间规则内,大于 0 表示倒计时 public static long VerifyDateEndTime(string timeStr); // // 摘要: // 获取开始倒计时 验证时间:[*][*][20/22][*][10:00-11:59/16:00-17:59] // 第一个是年,,第二个是月,第三个是日期,第四个是星期,第五个是时间, // 每一个参数,"-" 表示 到 如:“2015-2017”表示 2015 到 2017, "/" 表示 或者 如: “2015/2017”表示2015 // 或者 2017 // 返回值 -1 表示永久过期,0 表示在时间规则内,大于 0 表示倒计时 public static long VerifyDateTime(string timeStr);
时间匹配函数,看到这里后,请不要给我提quartz 因为我只会回答你不同的需求,不同的环境会有不同的使用情况
位运算辅助函数
Net.Sz.CFramework.Struct.EnumStatus status2 = << , << );
使用方式和详解请看 状态机
接下来介绍日志组建
本日志组建支持大约输出日志信息的文件名函数名和行号方法是异步处理的支持写入文件,文件写入格式是每天一个文件。
//是否显示控制台打印 Net.Sz.CFramework.Log.Logger.LOGCONSOLE = true; //只支持三种格式。控制台输出,info级别和error级别 Net.Sz.CFramework.Log.Logger.LOGLEVEL = Net.Sz.CFramework.Log.ENUM_LOGLEVEL.DEBUG; Net.Sz.CFramework.Log.Logger.Debug(, "test"); Net.Sz.CFramework.Log.Logger.Info(, "test"); Net.Sz.CFramework.Log.Logger.Error(, "test"); //只显示info Net.Sz.CFramework.Log.Logger.LOGLEVEL = Net.Sz.CFramework.Log.ENUM_LOGLEVEL.INFO; Net.Sz.CFramework.Log.Logger.Debug(, "test"); Net.Sz.CFramework.Log.Logger.Info(, "test"); Net.Sz.CFramework.Log.Logger.Error(, "test");
大约信息如下
[-- :::: Debug:CApp1.Program, Main, ] ->test [-- :::: Info :CApp1.Program, Main, ] ->test [-- :::: Error:CApp1.Program, Main, ] ->test [-- :::: Info :CApp1.Program, Main, ] ->test [-- :::: Error:CApp1.Program, Main, ] ->test
线程模型.
这里包含了线程模型,任务模型和定时器任务模型
//是以一个线程执行任务的线程模型 ); //是以十个线程执行任务的线程模型 ); //创建一个简单任务 Net.Sz.CFramework.Threading.ThreadPool.AddTask(t1, new Net.Sz.CFramework.Threading.TaskModel_Action(() => { Net.Sz.CFramework.Log.Logger.Debug("TaskModel_Action 简单任务"); })); //创建一个简单的定时器任务,创建一个执行3次,每个2秒执行一次的任务 Net.Sz.CFramework.Threading.ThreadPool.AddTimerTask(t1, , , () => { Net.Sz.CFramework.Log.Logger.Debug("TimerTask_Action 简单任务"); }));
输出
[-- :::: Info :Net.Sz.CFramework.Threading.ThreadModel, .ctor, ] 初始化 < 全局线程线程 > [-- :::: Info :Net.Sz.CFramework.Threading.ThreadModel, .ctor, ] 初始化 < Back Thread线程_1 > [-- :::: Info :Net.Sz.CFramework.Threading.ThreadModel, .ctor, ] 初始化 < Back Thread线程_2 > [-- :::: Debug:Net.Sz.CFramework.Threading.ThreadModel, AddTimerTask, ] Back Thread 接手定时器任务 Net.Sz.CFramework.Threading.Timer.GlobTimerEvent [-- :::: Info :Net.Sz.CFramework.Threading.TimerThread, .ctor, ] 初始化 < timer 线程 > [-- :::: Info :Net.Sz.CFramework.Threading.ThreadModel, .ctor, ] 初始化 < test线程 > [-- :::: Info :Net.Sz.CFramework.Threading.ThreadModel, .ctor, ] 初始化 < test线程_1 > [-- :::: Info :Net.Sz.CFramework.Threading.ThreadModel, .ctor, ] 初始化 < test线程_2 > [-- :::: Info :Net.Sz.CFramework.Threading.ThreadModel, .ctor, ] 初始化 < test线程_3 > [-- :::: Info :Net.Sz.CFramework.Threading.ThreadModel, .ctor, ] 初始化 < test线程_4 > [-- :::: Info :Net.Sz.CFramework.Threading.ThreadModel, .ctor, ] 初始化 < test线程_5 > [-- :::: Info :Net.Sz.CFramework.Threading.ThreadModel, .ctor, ] 初始化 < test线程_6 > [-- :::: Info :Net.Sz.CFramework.Threading.ThreadModel, .ctor, ] 初始化 < test线程_7 > [-- :::: Info :Net.Sz.CFramework.Threading.ThreadModel, .ctor, ] 初始化 < test线程_8 > [-- :::: Info :Net.Sz.CFramework.Threading.ThreadModel, .ctor, ] 初始化 < test线程_9 > [-- :::: Info :Net.Sz.CFramework.Threading.ThreadModel, .ctor, ] 初始化 < test线程_10 > [-- :::: Debug:CApp1.Program, <Main>b__0, ] TaskModel_Action 简单任务 [-- :::: Debug:Net.Sz.CFramework.Threading.ThreadModel, AddTimerTask, ] test 接手定时器任务 Net.Sz.CFramework.Threading.TimerTask_Action [-- :::: Debug:CApp1.Program, <Main>b__1, ] TimerTask_Action 简单任务 [-- :::: Debug:CApp1.Program, <Main>b__1, ] TimerTask_Action 简单任务 [-- :::: Debug:CApp1.Program, <Main>b__1, ] TimerTask_Action 简单任务
Socket Tcp组建
tcp监听需要实现IIOSessionHandler接口
// 摘要: // http监听处理 // @author 失足程序员 // @Blog http://www.cnblogs.com/ty408/ // @mail 492794628@qq.com // @phone 13882122019 public interface IIOSessionHandler { // 摘要: // 新建链接 // // 参数: // session: void channelActive(IOSession session); // // 摘要: // 链接闲置状态 // // 参数: // session: void channelInactive(IOSession session); // // 摘要: // 有消息,请注意消息是多线程处理的。也许你前一个消息没有处理完成,后一个消息已经来了 // // 参数: // session: // // buffer: void channelRead(IOSession session, byte[] buffer); // // 摘要: // 链接断开 // // 参数: // session: void channelUnregistered(IOSession session, params string[] obj); // // 摘要: // 链接发送异常 // // 参数: // session: // // ex: void exceptionCaught(IOSession session, Exception ex); }
//客户端和服务器都需要这个处理接口实现 Net.Sz.CFramework.Netty.NettyPool.SessionHandler = new MySessionHandler(); //创建对ip127.0.0.1端口9527的tcp监听,使用一个线程处理这个监听的io信息 Net.Sz.CFramework.Netty.NettyPool.AddTcpBind(, ); //创建对服务器连接 Net.Sz.CFramework.Netty.Tcp.NettyClient client = ); client.Connect();
需要特别注意public void channelRead(Net.Sz.CFramework.Netty.IOSession session, byte[] buffer)这个函数收到的消息的字节数组是一个完整的独立包
#pragma once #include "stdafx.h" #include "BufferReader.h" #include "BufferWriter.h" using namespace System; namespace Net{ namespace Sz{ namespace CFramework{ namespace Netty{ namespace Buffer{ using namespace System::IO; using namespace System::Collections::Generic; /// <summary> /// 字节流书写器 /// <para>@author 失足程序员</para> /// <para>@Blog http://www.cnblogs.com/ty408/</para> /// <para>@mail 492794628@qq.com</para> /// <para>@phone 13882122019</para> /// </summary> ref class DefaultMarshalEndian { //用于存储剩余未解析的字节数 private: List<Byte>^ _LBuff = gcnew List<Byte>(); //字节数常量一个消息id4个字节 const long ConstLenght = 8L; const short ConstStart1 = 0xaa; const short ConstStart2 = 0xbb; public: List<array<Byte>^>^ Decoder(array<Byte>^ buff) { ) { //拷贝之前遗留的字节 this->_LBuff->AddRange(buff); buff = this->_LBuff->ToArray(); ); } List<array<Byte>^>^ list = gcnew List<array<Byte>^>(); BufferReader^ buffers = gcnew BufferReader(buff); try { array<Byte>^ _buff; Label_0073: //判断本次解析的字节是否满足常量字节数 if ((buffers->BaseStream->Length - buffers->BaseStream->Position) < ConstLenght) { _buff = buffers->ReadBytes((int)(buffers->BaseStream->Length - buffers->BaseStream->Position)); this->_LBuff->AddRange(_buff); } else { short tmpStart1 = buffers->ReadInt16(); if (ConstStart1 == tmpStart1)//自定义头相同 { short tmpStart2 = buffers->ReadInt16(); if (ConstStart2 == tmpStart2)//自定义头相同 { long offset = buffers->ReadInt32(); //剩余字节数大于本次需要读取的字节数 if (offset <= (buffers->BaseStream->Length - buffers->BaseStream->Position)) { _buff = buffers->ReadBytes((int)(offset)); list->Add(_buff); goto Label_0073; } else { //剩余字节数刚好小于本次读取的字节数 存起来,等待接受剩余字节数一起解析 buffers->BaseStream->Seek(ConstLenght, System::IO::SeekOrigin::Current); _buff = buffers->ReadBytes((int)(buffers->BaseStream->Length - buffers->BaseStream->Position)); this->_LBuff->AddRange(_buff); } } else { //往前推三个字节 buffers->BaseStream->Seek(-, System::IO::SeekOrigin::Current); goto Label_0073; } } else { //往前推一个字节 buffers->BaseStream->Seek(-, System::IO::SeekOrigin::Current); goto Label_0073; } } } catch (Exception^){} finally { buffers->Close(); delete buffers; } return list; } void Encoder(array<Byte>^ msgBuffer, BufferWriter^ %outBuf) { outBuf->Write(ConstStart1); outBuf->Write(ConstStart2); if (msgBuffer != nullptr) { outBuf->Write((Int32)(msgBuffer->Length)); outBuf->Write(msgBuffer); } else { outBuf->Write((Int32)); } } }; } } } } }
解码和编码器
[-- :::: Info :Net.Sz.CFramework.Netty.Tcp.NettyServer, .ctor, ] Start Listen Tcp Socket -> [-- :::: Info :Net.Sz.CFramework.Threading.ThreadModel, .ctor, ] 初始化 < 全局线程线程 > [-- :::: Info :Net.Sz.CFramework.Threading.ThreadModel, .ctor, ] 初始化 < Back Thread线程_1 > [-- :::: Info :Net.Sz.CFramework.Threading.ThreadModel, .ctor, ] 初始化 < Back Thread线程_2 > [-- :::: Debug:Net.Sz.CFramework.Threading.ThreadModel, AddTimerTask, ] Back Thread 接手定时器任务 Net.Sz.CFramework.Threading.Timer.GlobTimerEvent [-- :::: Info :Net.Sz.CFramework.Threading.TimerThread, .ctor, ] 初始化 < timer 线程 > [-- :::: Info :Net.Sz.CFramework.Threading.ThreadModel, .ctor, ] 初始化 < Netty Session Pool Thread:127.0.0.1:9527线程 > [-- :::: Info :Net.Sz.CFramework.Threading.ThreadModel, .ctor, ] 初始化 < Netty Session Pool Thread线程 > [-- :::: Debug:Net.Sz.CFramework.Threading.ThreadModel, AddTimerTask, ] Netty Session Pool Thread 接手定时器任务 Net.Sz.CFramework.Netty.CheckIOSessionTimerTask [-- :::: Debug:Net.Sz.CFramework.Netty.Tcp.NettyClient, Connect, ] Try Connect Tcp Socket Remote: [-- :::: Debug:Net.Sz.CFramework.Netty.Tcp.NettyClient, Connect, ] Connect Tcp Socket Remote Socket RemoteEndPoint: LocalEndPoint: [-- :::: Info :Net.Sz.CFramework.Netty.Tcp.NettyServer, AcceptAsync_Async, ] Create Tcp Socket Remote Socket LocalEndPoint: RemoteEndPoint:
Socket Http监听
需要实现
// 摘要: // http监听处理 // @author 失足程序员 // @Blog http://www.cnblogs.com/ty408/ // @mail 492794628@qq.com // @phone 13882122019 public interface IHttpHandler : IBaseScript { // 摘要: // 并发处理的 // // 参数: // session: // 连接对象 void Action(HttpSession session); }
class Program { static void Main(string[] args) { //创建login目录的监听,处理程序是LoginHttpHandler,单线程处理请求 Net.Sz.CFramework.Netty.NettyPool.AddHttpBind(, ); Console.ReadLine(); } } class LoginHttpHandler : Net.Sz.CFramework.Netty.Http.IHttpHandler { public void Action(Net.Sz.CFramework.Netty.Http.HttpSession session) { session.WriteSuccess(); session.AddBody("Login OK"); session.WriteFlush(); } }
脚步使用功能
使用脚步功能,C#的文件类,*.cs文件类如果是实现IBaseScript可以放到脚步管理器里面进行查找如果实现IInitBaseScript接口执行初始化函数;如果没有只实现IInitBaseScript不会放到脚步管理,
// 摘要: // 脚本基类 // @author 失足程序员 // @Blog http://www.cnblogs.com/ty408/ // @mail 492794628@qq.com // @phone 13882122019 public interface IBaseScript // 摘要: // 脚本基类 // 执行init初始化信息 // PS:实现这个接口不会放到脚步缓存集合中,如果需要请实现 IBaseScript // @author 失足程序员 // @Blog http://www.cnblogs.com/ty408/ // @mail 492794628@qq.com // @phone 13882122019 public interface IInitBaseScript { // 摘要: // 卸载脚本 void InitScript(); }
//传入文件路径,可以是相对路径也可以是绝对路径,后面可以传入需要引入的dll文件或者exe文件用于编译和加载 ScriptManager.LoadCSharpFile(new String[] { "" }, "");
这里以我的游戏程序距离
public static List<string> LoadScript() { return ScriptManager.LoadCSharpFile(new string[] { "../../../../Net.Sz.Game.MMOGame.GameServer.Scripts/Src" }, "protobuf-net.dll", "EntityFramework.dll", "MySql.Data.dll", "Net.Sz.Framework.DB.dll", "MySql.Data.Entity.EF6.dll", "Net.Sz.Game.MMOGame.GameMessages.dll", "Net.Sz.Game.MMOGame.GameModel.dll" ); } public static Net.Sz.CFramework.Script.ScriptPool ScriptManager { get; private set; } /// <summary> /// /// </summary> public static void Start() { Net.Sz.CFramework.Struct.SzExtensions.Console_Show("Server", false, true); try { LoadScript(); } catch (Exception) { throw; } }
这是我的底层库支持。望各位大仙多多指教!
对应提供下载.
java 版本的源码下载
介绍,介绍我的底层支持库 Net.Sz.CFramework的更多相关文章
- 介绍三个Android支持库控件:TabLayout+ViewPager+RecyclerView
本文主要介绍如下三个Android支持库控件的配合使用: TabLayout:android.support.design.widget.TabLayout ViewPager:android.sup ...
- Android百分比布局支持库介绍——com.android.support:percent(转)
转载自http://www.apkbus.com/forum.php?mod=viewthread&tid=244752&extra=&_dsign=0b699c42 在此之前 ...
- Lucene3.6.2包介绍,第一个Lucene案例介绍,查看索引信息的工具lukeall介绍,Luke查看的索引库内容,索引查找过程
2.Lucene3.6.2包介绍,第一个Lucene案例介绍,查看索引信息的工具lukeall介绍,Luke查看的索引库内容,索引查找过程 2014-12-07 23:39 2623人阅读 评论(0) ...
- YARN底层基础库
YARN基础库是其他一切模块的基础,它的设计直接决定了YARN的稳定性和扩展性,YARN借用了MRV1的一些底层基础库,比如RPC库等,但因为引入了很多新的软件设计方式,所以它的基础库更多,包括直 ...
- uTenux——重新整理底层驱动库
重新整理底层驱动库 1. 整理chip.h 在chip.h文件中的07----13的宏定义设置位如下,这样我们就不用在工程配中定义sam3s4c这个宏了,为我们以后通用少了一件麻烦事. //#if d ...
- 用c++ 给易语言写支持库学习记录
废话我就不对说 直接开始 易语言官方下载的易语言安装路径下 有一个SDK文件夹 我们点进入cpp文件夹里面提供是c++的SDK elib文件夹里就是sdk 我们新建一个win32项目 这里我用的是VS ...
- 【深入浅出 Yarn 架构与实现】2-2 Yarn 基础库 - 底层通信库 RPC
RPC(Remote Procedure Call) 是 Hadoop 服务通信的关键库,支撑上层分布式环境下复杂的进程间(Inter-Process Communication, IPC)通信逻辑, ...
- Python底层socket库
Python底层socket库将Unix关于网络通信的系统调用对象化处理,是底层函数的高级封装,socket()函数返回一个套接字,它的方法实现了各种套接字系统调用.read与write与Python ...
- DCMTK3.6.1(MD支持库)安装说明
转载:http://qimo601.iteye.com/blog/1685135 [前言] 最近,因为需要开发DICOM网管模块,必须使用DCMTK的DcmNet模块.但是DCMTK3.6.0在Dcm ...
随机推荐
- 我为什么要写LeetCode的博客?
# 增强学习成果 有一个研究成果,在学习中传授他人知识和讨论是最高效的做法,而看书则是最低效的做法(具体研究成果没找到地址).我写LeetCode博客主要目的是增强学习成果.当然,我也想出名,然而不知 ...
- 流程开发Activiti 与SpringMVC整合实例
流程(Activiti) 流程是完成一系列有序动作的概述.每一个节点动作的结果将对后面的具体操作步骤产生影响.信息化系统中流程的功能完全等同于纸上办公的层级审批,尤其在oa系统中各类电子流提现较为明显 ...
- TortoiseGit 文件比对工具使用 Beyond Compare 和 DiffMerge
TortoiseGit 内置的文件比对工具是 TortoiseMerge,用于文件比对和解决冲突合并,TortoiseGit 还支持外部的比对工具使用,比如 Beyond Compare 和 Diff ...
- 阿里云服务器上配置并使用: PHP + Redis + Mysql 从配置到使用
(原创出处为本博客,http://www.cnblogs.com/linguanh/) 目录: 一,下载 二,解压 三,配置与启动 四,测试 Redis 五,配置 phpRedis 扩展 六,综合测试 ...
- python之最强王者(9)——函数
1.Python 函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但 ...
- 2000条你应知的WPF小姿势 基础篇<28-33 WPF启动故事>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...
- 基于Quick-cocos2d-x的资源更新方案 二
写在前面 又是12点半了,对于一个程序员来说,这是一个黄金时间,精力旺盛,我想,是最适合整理和分享一些思路的时候了. 自从上次写了 基于Quick-cocos2d-x的资源更新方案 同样可见quick ...
- RabbitMQ基础知识
RabbitMQ基础知识 一.背景 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然 ...
- CSharpGL(15)用GLSL渲染2种类型的文字
CSharpGL(15)用GLSL渲染2种类型的文字 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立的Demo,更适合 ...
- ABP框架 - 工作单元
文档目录 本节内容: 简介 在ABP中管理连接和事务 约定的工作单元 UnitOfWork 特性 IUnitOfWorkManager 工作单元详情 禁用工作单元 非事务性工作单元 工作单元方法调用另 ...