介绍,介绍我的底层支持库 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 ...
随机推荐
- Linux CentOS 配置Tomcat环境
一.下载Tomcat 下载Tomcat方式也有两种,可以参考我的前一篇博文Linux CentOS配置JDK环境,这边就不再赘述. 二.在Linux处理Tomcat包 1.创建tomcat文件夹 mk ...
- 前端学HTTP之Web主机托管
前面的话 对内容资源的存储.协调以及管理的职责统称为Web主机托管.主机托管是Web服务器的主要功能之一.保存并提供内容,记录对内容的访问以及管理内容都离不开服务器.如果不想自行管理服务器所需的软硬件 ...
- vue.js初探
前言 入手2016最火前端框架之一vue.js.大概从网上找了些资料看了下vue.js,从网上的资料来看只能惊叹其发展速度太快,让我意外的是其作者是华人的前提下作品这么受欢迎. 网上的博客和教程各种组 ...
- EntityFramework的多种记录日志方式,记录错误并分析执行时间过长原因(系列4)
前言 Entity Framework 延伸系列目录 今天我们来聊聊EF的日志记录. 一个好的数据库操作记录不仅仅可以帮你记录用户的操作, 更应该可以帮助你获得效率低下的语句来帮你提高运行效率 废话不 ...
- Microsoft Visual Studio 2017 for Mac Preview 下载+安装+案例Demo
目录: 0. 前言 1. 在线安装器 2. 安装VS 3. HelloWorld 4. ASP.NET MVC 5. 软件下载 6. 结尾 0. 前言: 工作原因,上下班背着我的雷神,一个月瘦了10斤 ...
- SQL Server常见问题介绍及快速解决建议
前言 本文旨在帮助SQL Server数据库的使用人员了解常见的问题,及快速解决这些问题.这些问题是数据库的常规管理问题,对于很多对数据库没有深入了解的朋友提供一个大概的常见问题框架. 下面一些问题是 ...
- [jquery]显示隐藏div标签的几种方法
1.$("#demo").attr("style","display:none;");//隐藏div $("#demo" ...
- #26 fibonacci seqs
Difficulty: Easy Topic: Fibonacci seqs Write a function which returns the first X fibonacci numbers. ...
- 项目自动化建构工具gradle 入门1——输出helloWorld
先来一个简单的例子,4个步骤: 1.进入D:\work\gradle\java 目录 ,您电脑没这目录? 那辛苦自己一级一级建立起来吧 新建文件build.gradle,文件内容是: apply p ...
- Linux文件查找.md
Linux 文件查找 在Linux系统的查找相关的命令: which 查看可执行文件的位置 whereis 查看文件的位置 locate 配合数据库查看文件位置 find 实际搜寻硬盘查询文件名称 w ...