介绍,介绍我的底层支持库 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 ...
随机推荐
- HTML DOM 对象
本篇主要介绍HTML DOM 对象:Document.Element.Attr.Event等4个对象. 目录 1. Document 对象:表示文档树的根节点,大部分属性和方法都是对元素进行操作. 2 ...
- MVVM TextBox的键盘事件
MVVM下RichTextBox的键盘回车事件设置为发送,不是回车 xmlns:i="http://schemas.microsoft.com/expression/2010/interac ...
- Spring中Bean的实例化
Spring中Bean的实例化 在介绍Bean的三种实例化的方式之前,我们首先需要介绍一下什么是Bean,以及Bean的配置方式. 如果 ...
- Java—恶心的java.lang.NumberFormatException解决
项目中要把十六进制字符串转化为十进制, 用到了到了Integer.parseInt(str1.trim(), 16):这个是不是后抛出java.lang.NumberFormatException异常 ...
- android计算每个目录剩余空间丶总空间以及SD卡剩余空间
ublic class MemorySpaceCheck { /** * 计算剩余空间 * @param path * @return */ public static String getAvail ...
- 敏捷转型历程 - Sprint4 回顾会
我: Tech Leader 团队:团队成员分布在两个城市,我所在的城市包括我有4个成员,另外一个城市包括SM有7个成员.另外由于我们的BA离职了,我暂代IT 的PO 职位.PM和我在一个城市,但他不 ...
- 数据库 DML、DDL、DCL区别 .
总体解释: DML(data manipulation language): 它们是SELECT.UPDATE.INSERT.DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的 ...
- 微软开放.NET框架源代码和Mono
微软一直在朝着更加开放的方向努力.例如,公司首席执行官萨特亚纳德拉(Satya Nadella)在Windows 10预览发布会上声称微软喜欢Linux,这并不出人意料,但是对于一家将Linux视作威 ...
- .NET Portability Analyzer 已开源
在一年前介绍过<介绍.NET 开发必备工具 .NET Portability Analyzer>,微软已经把代码开源到Github:https://github.com/Microsoft ...
- 巧用 mask-image 实现简单进度加载界面
最近给 nzoo 折腾官网,拿 angular2.0 + webpack 实现SPA,然后觉得最终打包后的出口文件有点大,用户首次访问会有一个时间较长的白屏等候界面,感觉体验不太好. 于是希望在用户下 ...