介绍,介绍我的底层支持库 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 ...
随机推荐
- Atitit 项目语言的选择 java c#.net php??
Atitit 项目语言的选择 java c#.net php?? 1.1. 编程语言与技术,应该使用开放式的目前流行的语言趋势1 1.2. 从个人职业生涯考虑,java优先1 1.3. 从项目实际来 ...
- Web大前端时代之:HTML5+CSS3入门系列
准备来一波新技术,待续.... Old: 联系源码:https://github.com/dunitian/LoTHTML5 文档下载:https://github.com/dunitian/LoTD ...
- AFNetworking 3.0 源码解读(八)之 AFImageDownloader
AFImageDownloader 这个类对写DownloadManager有很大的借鉴意义.在平时的开发中,当我们使用UIImageView加载一个网络上的图片时,其原理就是把图片下载下来,然后再赋 ...
- [C#] C# 知识回顾 - 表达式树 Expression Trees
C# 知识回顾 - 表达式树 Expression Trees 目录 简介 Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译表达式树 执行表达式树 修改表达 ...
- “此网页上的某个 Web 部件或 Web 表单控件无法显示或导入。找不到该类型,或该类型未注册为安全类型。”
自从vs装了Resharper,看见提示总是手贱的想去改掉它.于是乎手一抖,把一个 可视web部件的命名空间给改了. 喏,从LibrarySharePoint.WebPart.LibraryAddEd ...
- iOS之延时执行(睡眠)的几种方法
1. 最直接的方法: [self performSelector:@selector(deleyMethod) withObject:nil afterDelay:1.0]; 此方式要求必须在主线程中 ...
- CentOS:设置系统级代理(转)
原文地址:http://www.cnblogs.com/cocowool/archive/2012/07/05/2578487.html YUM代理设置 编辑/etc/yum.conf,在最后加入 # ...
- .NET跨平台之旅:将示例站点升级至 .NET Core 1.1 Preview 1
今天微软发布了 .NET Core 1.1 Preview 1(详见 Announcing .NET Core 1.1 Preview 1 ),紧跟 .NET Core 前进的步伐,我们将示例站点 h ...
- 学习笔记:7z在delphi的应用
最近做个发邮件的功能,需要将日志文件通过邮件发送回来用于分析,但是日志文件可能会超级大,测算下来一天可能会有800M的大小.所以压缩是不可避免了,delphi中的默认压缩算法整了半天不太好使,就看了看 ...
- Centos、Ubuntu 安装 Mono、Jexus
Mono是.NET的跨平台实现 在众多关于语言的争论中,.NET一直被以不能跨平台而诟病,Mono改变了这一现状. 有人当心Mono会涉及版权啥的问题.高深的偶不懂,不过我觉得Unity3D都能用,为 ...