介绍,介绍我的底层支持库 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 ...
随机推荐
- ExtJS 4.2 业务开发(二)数据展示和查询
本篇开始模拟一个船舶管理系统,提供查询.添加.修改船舶的功能,这里介绍其中的数据展示和查询功能. 目录 1. 数据展示 2. 数据查询 3. 在线演示 1. 数据展示 在这里我们将模拟一个船舶管理系统 ...
- InnoDB体系结构学习笔记
后台线程 Master Thread 核心的后台线程,主要负责将缓冲池的数据异步刷新到磁盘,保证数据的一致性,包括(脏页的刷新).合并插入缓冲.(UNDO页的回收)等 IO Thread 4个writ ...
- ASP.NET Core应用针对静态文件请求的处理[3]: StaticFileMiddleware中间件如何处理针对文件请求
我们通过<以Web的形式发布静态文件>和<条件请求与区间请求>中的实例演示,以及上面针对条件请求和区间请求的介绍,从提供的功能和特性的角度对这个名为StaticFileMidd ...
- 步入angularjs directive(指令)--准备工作熟悉hasOwnProperty
在讲解directive之前,先做一下准备工作,为何要这样呢? 因为我们不是简单的说说directive怎么用,还要知道为什么这么用!(今天我们先磨磨刀!). 首先我们讲讲js 基础的知识--hasO ...
- golang sync.WaitGroup bug
注意,这个结构体,要是想在函数之间传来传去的话,必须要使用指针....... 这个结构体里没有 指针,这个类型可以说没有“引用特性”. 被坑了一晚上.特此记录.
- iOS开源项目周报1222
由OpenDigg 出品的iOS开源项目周报第二期来啦.我们的iOS开源周报集合了OpenDigg一周来新收录的优质的iOS开发方面的开源项目,方便iOS开发人员便捷的找到自己需要的项目工具等. io ...
- Oracle使用触发器和mysql中使用触发器的比较——学习笔记
一.触发器 1.触发器在数据库里以独立的对象存储, 2.触发器不需要调用,它由一个事件来触发运行 3.触发器不能接收参数 --触发器的应用 举个例子:校内网.开心网.facebook,当你发一个日志, ...
- JqueryQrcode生成二维码不支持中文的解决办法
JqueryQrcode.js有一个小小的缺点,就是默认不支持中文. 这跟js的机制有关系,jquery-qrcode这个库是采用 charCodeAt() 这个方式进行编码转换的, 而这个方法默认会 ...
- React 其实比 MVVM 架构更加卡顿
React 号称通过引入 Virtual DOM 带来了性能的提升,而其实 React 之所以需要 Virtual DOM,是因为它的架构下,state 的变更是全量的,然后触发 render 返回全 ...
- ABP源码分析十四:Entity的设计
IEntity<TPrimaryKey>: 封装了PrimaryKey:Id,这是一个泛型类型 IEntity: 封装了PrimaryKey:Id,这是一个int类型 Entity< ...