您现在的位置是:亿华云 > 数据库
一个开源的服务器框架,特别适用于开发小游戏
亿华云2025-10-08 18:54:35【数据库】0人已围观
简介jwEngine一个跨平台的c++<->lua服务器快速解决方案,该框架即可快速响应服务器开发工作,设计思想:“让事情变得更简单”网络底层采用libuvnode.js底层库),异步io助力
jwEngine
一个跨平台的个开c++<->lua服务器快速解决方案,该框架即可快速响应服务器开发工作,源的用于设计思想:“让事情变得更简单”
网络底层采用libuv(node.js底层库),服务异步io助力使单线程也能释放澎湃动力,器框跨平台支持epoll、架特iocp、别适ipv6。小游戏框架支持tcp、个开udp/kcp、源的用于websocket、服务http,器框并保证了接口的架特一致性,使用了sol2将所有接口都导出到lua,别适可以选择用lua开发逻辑。小游戏
使用modern c++开发,个开尽可能的使用std::move、std::string_view减少内存复制。云服务器
该框架使用异步事件,不建议使用多线程,避免多线程上下文切换开销和破坏代码美感,网络部分和逻辑部分使用一个主事件循环驱动。建议的方案是多进程单线程的横向扩展,按照业务控制各个进程的粒度,当然mysql和redis可以加入到线程池中。
创建一个tcp服务器
只需要简单几行代码即可创建一个tcp高性能服务器,并自动处理数据包头和粘包(其中包头包含消息长度和协议号),构建一个完好的NetPacket交给你。
class INetEvent : public NetEvent { public: virtual void onAccept(NetConnect * conn){ } virtual void onClose(NetConnect * conn){ } virtual void onMsg(NetConnect * conn, int msgtype, NetPacket * pack){ } }; int main() { EventLoop::Instance()->init(); INetEvent eve; NetServer server(EventLoop::Instance(), &eve); server.listen("127.0.0.1", 3001); return EventLoop::Instance()->run(); }创建一个kcp服务器
c++的kcp服务器示例,快速构建你的帧同步服务器,保证消息的可靠性
class KNetEvent : public KcpEvent { public: virtual void onAccept(KcpSession * conn){ }; virtual void onClose(KcpSession * conn){ }; virtual void onMsg(KcpSession * conn, int msgtype, UdpPacket * pack){ } virtual void onUdpTimeout(KcpSession * s){ } }; int main() { EventLoop::Instance()->init(); KNetEvent eve; KcpServer server(EventLoop::Instance(), &eve); server.start("127.0.0.1", 3001); return EventLoop::Instance()->run(); }创建一个websocket服务器
自动完成解析websocket协议工作
class IWebEvent : public WebSocketEvent { public: virtual void onHandshake(WebSocketConnect * conn){ }; virtual void onAccept(WebSocketConnect * conn){ }; virtual void onClose(WebSocketConnect * conn){ }; virtual void onMsg(WebSocketConnect * conn, WebSocketPacket * pack){ }; }; int main() { EventLoop::Instance()->init(); IWebEvent wevent; WebSocketServer server(EventLoop::Instance(), &wevent); server.listen("127.0.0.1", 8080); return EventLoop::Instance()->run(); }创建一个http服务器
http仅支持简单的服务器租用get post请求
const char * html = R"(<html> <body> <h1>login</h1> <p>hello world!</p> <form action="login" method="post"> <input type="text" name="user"/> <input type="password" name="pass"/> <input type="submit" value="login"/> </form> </body> </html>)"; const char * succeed = "" "<html>" "<body>" "<h1>login succeed</h1>" "</body>" "</html>"; const char * failing = "" "<html>" "<body>" "<h1>login failing</h1>" "</body>" "</html>"; int main() { EventLoop::Instance()->init(); HttpServer server(EventLoop::Instance()); server.listen("127.0.0.1", 80); server.addGet("/", [](HttpConnect *conn, std::string_view & data) { conn->autoMsg(html); }); server.addPost("/login", [](HttpConnect *conn, std::string_view & data) { HttpParam hp(data); if (hp.getStr("user") == "jw" && hp.getStr("pass") == "1111") { conn->autoMsg(succeed); } else { conn->autoMsg(failing); } }); return EventLoop::Instance()->run(); }mysql和线程池
这次我们用lua示例:
local config = DBConfig:new() config.device = "mysql" config.ip = "127.0.0.1" config.dbname = "jw_test" config.user = "root" config.pswd = "1111" config.port = 3306 pool = DBThreadPool:new(config) pool:create(1) func = function(err, result) while(result:fetch()) do local id = result:getInt32() local num = result:getInt32() local name = result:getString() local str = "id:" .. id .. ", num:" .. num .. ", name:" .. name print(str) end end function exec() local sql = SqlCommand:new("select * from test where id = ?") sql:pushInt32(1) sql:addToPool(pool, func) end event_init() exec() timer = UTimer:new() timer:start(function () pool:update() end, 10, 10) event_run()任意扩展进程节点
你可以任意扩展你的进程,示例:
base进程 cell进程 db进程 start engine.exe base.lua start engine.exe cell.lua start engine.exe db.lua提供一个serialization序列化工具
类似于c++的语法,写起来非常简单,示例:
struct testmsg { int32 x int32 y int32 z int8 state vector<int32> vec read{ [x, y, z, state] if(state == 1) { [vec] } } write{ [x, y, z, state, vec] } }通过serialization工具可以将协议的描述文件生成c++和lua代码,自动生成read()和write()的函数实现,使得数据结构快速映射到SocketBuffer中。
目前serialization序列化工具为实验性,可能是脆弱的,建议使用更强大的protobuf。该项目已集成lua-protobuf,使得c++和lua之间的协议无缝衔接。
lua-protobuf的开源地址: lua-protobuf
这个示例展示了c++客户端和lua服务器之间的亿华云通讯: 快速搭建服务器Demo
构建
你需要一个modern c++17编译器
vs2017 测试通过 gcc version 9.3.0 测试通过很赞哦!(2747)