介绍,介绍我的底层支持库 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 ...
随机推荐
- Matlab 高斯_拉普拉斯滤波器处理医学图像
前言:本程序是我去年实现论文算法时所做.主要功能为标记切割肝脏区域.时间有点久,很多细节已经模糊加上代码做了很多注释,因此在博客中不再详述. NOTE: 程序分几大段功能模块,仔细阅读,对解决医学图像 ...
- .NET CoreCLR开发人员指南(上)
1.为什么每一个CLR开发人员都需要读这篇文章 和所有的其他的大型代码库相比,CLR代码库有很多而且比较成熟的代码调试工具去检测BUG.对于程序员来说,理解这些规则和习惯写法非常的重要. 这篇文章让所 ...
- 深入理解 JavaScript,以及 Linux 下的开发调试工具
前言 JavaScript 是我接触到的第二门编程语言,第一门是 C 语言.然后才是 C++.Java 还有其它一些什么.所以我对 JavaScript 是非常有感情的,毕竟使用它有十多年了.早就想写 ...
- 多线程条件通行工具——CountDownLatch
CountDownLatch的作用是,线程进入等待后,需要计数器达到0才能通行. CountDownLatch(int)构造方法,指定初始计数. await()等待计数减至0. await(long, ...
- Android local.properties 文件读取
转载请标明出处:http://www.cnblogs.com/zhaoyanjun/p/6202369.html 本文出自[赵彦军的博客] 在Android Studio项目里面有个local.pro ...
- 分享一个MySQL分库分表备份脚本(原)
分享一个MySQL分库备份脚本(原) 开发思路: 1.路径:规定备份到什么位置,把路径(先判断是否存在,不存在创建一个目录)先定义好,我的路径:/mysql/backup,每个备份用压缩提升效率,带上 ...
- 2DToolkit官方文档中文版打地鼠教程(二):设置摄像机
这是2DToolkit官方文档中 Whack a Mole 打地鼠教程的译文,为了减少文中过多重复操作的翻译,以及一些无必要的句子,这里我假设你有Unity的基础知识(例如了解如何新建Sprite等) ...
- asp.net中ashx生成验证码代码放在Linux(centos)主机上访问时无法显示问题
最近有个项目加入了验证码功能,就从自己博客以前的代码中找到直接使用,直接访问验证码页面报错如下: 源代码:asp.net中使用一般处理程序生成验证码 Application Exception Sys ...
- 小丁是怎样入门git的
0x01前言 既然没有华丽的出场,那就平凡的分享,首先我要说明一点本篇文章针对Git初学者,对我自己学Git的资源的整合,其实本篇索引应该在我写Git系列文章的时候就紧跟着放上索引的,由于时间问题没有 ...
- 细说websocket - php篇
下面我画了一个图演示 client 和 server 之间建立 websocket 连接时握手部分,这个部分在 node 中可以十分轻松的完成,因为 node 提供的 net 模块已经对 socket ...