介绍,介绍我的底层支持库 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 ...
随机推荐
- bootstrap + requireJS+ director+ knockout + web API = 一个时髦的单页程序
也许单页程序(Single Page Application)并不是什么时髦的玩意,像Gmail在很早之前就已经在使用这种模式.通常的说法是它通过避免页面刷新大大提高了网站的响应性,像操作桌面应用程序 ...
- Kotlin的Lambda表达式以及它们怎样简化Android开发(KAD 07)
作者:Antonio Leiva 时间:Jan 5, 2017 原文链接:https://antonioleiva.com/lambdas-kotlin/ 由于Lambda表达式允许更简单的方式建模式 ...
- 【Win 10 应用开发】应用预启动
所谓预启动,其实你一看那名字就知道是啥意思了,这是直接译,也找不到比这个叫法更简练的词了.在系统资源允许的情况下(比如电池电量充足,有足够的内存空间),系统会把用户常用的应用程序在后台启动,但不会显示 ...
- InstallShield 脚本语言学习笔记
InstallShield脚本语言是类似C语言,利用InstallShield的向导或模板都可以生成基本的脚本程序框架,可以在此基础上按自己的意愿进行修改和添加. 一.基本语法规则 ...
- 如何安全的将VMware vCenter Server使用的SQL Server Express数据库平滑升级到完整版
背景: 由于建设初期使用的vSphere vCenter for Windows版,其中安装自动化过程中会使用SQL Server Express的免费版数据库进行基础环境构建.而此时随着业务量的增加 ...
- 深入解析Sqlite的完美替代者,android数据库新王者——Realm
写在前面: 又到一年一度七夕虐狗节,看着大家忍受着各种朋友圈和QQ空间还有现实生活中的轮番轰炸,我实在不忍心再在这里给大家补刀,所以我觉得今天不虐狗,继续给大家分享有用的. 如果你比较关心androi ...
- redis成长之路——(二)
redis操作封装 针对这些常用结构,StackExchange.Redis已经做了一些封装,不过在实际应用场景中还必须添加一些功能,例如重试等 所以对一些常功能做了一些自行封装SERedisOper ...
- 记录一次bug解决过程:数据迁移
一 总结 不擅长语言表达,勤于沟通,多锻炼 调试MyBatis中SQL语法:foreach 问题:缺少关键字VALUES.很遗憾:它的错误报的让人找不着北. 二 BUG描述:MyBatis中批量插入数 ...
- Unable to create the selected property page. An error occurred while automatically activating bundle net.sourceforge.pmd
解决方案: 在命令行到eclipse目录下使用 eclipse.exe -clean
- Linux常用命令
命令格式与目录处理命令 ls 命令格式与目录处理命令 ls 命令格式:命令 [-选项][参数] 例:ls -la /etc 说明: 1)个别命令使用不遵循格式 2)当有多个选项时,可以写在一起 3)简 ...