看一看:一个开源的服务器框架,特别适用于开发小游戏
一个跨平台的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交给你。
创建一个kcp服务器
- classINetEvent:publicNetEvent
- {
- public:
- virtualvoidonAccept(NetConnect*conn){}
- virtualvoidonClose(NetConnect*conn){}
- virtualvoidonMsg(NetConnect*conn,intmsgtype,NetPacket*pack){}
- };
- intmain()
- {
- EventLoop::Instance()->init();
- INetEventeve;
- NetServerserver(EventLoop::Instance(),&eve);
- server房子强拆可以报警吗.listen("127.0.0.1",3001);
- returnEventLoop::Instance()->run();
- }
c++的kcp服务器示例,快速构建你的帧同步服务器,保证消息的可靠性
创建一个websocket服务器
- classKNetEvent:publicKcpEvent
- {
- public:
- virtualvoidonAccept(KcpSession*conn){};
- virtualvoidonClose(KcpSession*conn){};
- virtualvoidonMsg(KcpSession*conn,intmsgtype,UdpPacket*pack){}
- virtualvoidonUdpTimeout(KcpSession*s){}
- };
- intmain()
- {
- EventLoop::Instance()->init();
- KNetEventeve;
- KcpServerserver(EventLoop::Instance(),&eve);
- server.start("127.0.0.1",3001);
- returnEventLoop::Instance()->run();
- }
自动完成解析websocket协议工作
创建一个http服务器
- classIWebEvent:publicWebSocketEvent
- {
- public:
- virtualvoidonHandshake(WebSocketConnect*conn){};
- virtualvoidonAccept(WebSocketConnect*conn){};
- virtualvoidonClose(WebSocketConnect*conn){};
- virtualvoidonMsg(WebSocketConnect*conn,WebSocketPacket*pack){};
- };
- intmain()
- {
- EventLoop::Instance()->init();
- IWebEventwevent;
- WebSocketServerserver(EventLoop::Instance(),&wevent);
- server.listen("127.0.0.1",8080);
- returnEventLoop::Instance()->run();
- }
http仅支持简单的get post请求
mysql和线程池
- constchar*html=R"(<html>
- <body>
- <h1>login</h1>
- <p>helloworld!</p>
- <formaction="login"method="post">
- <inputtype="text"name="user"/>
- <inputtype="password"name="pass"/>
- <inputtype="submit"value="login"/>
- </form>
- </body>
- </html>)";
- constchar*succeed=""
- "<html>"
- "<body>"
- "<h1>loginsucceed</h1>"
- "</body>"
- "</html>";
- constchar*failing=""
- "<html>"
- "<body>"
- "<h1>loginfailing</h1>"
- "</body>"
- "</html>";
- intmain()
- {
- EventLoop::Instance()->init();
- HttpServerserver(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){
- HttpParamhp(data);
- if(hp.getStr("user")=="jw"&&hp.getStr("pass")=="1111")
- {
- conn->autoMsg(succeed);
- }
- else
- {
- conn->autoMsg(failing);
- }
- });
- returnEventLoop::Instance()->run();
- }
这次我们用lua示例:
任意扩展进程节点
- localconfig=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
- localid=result:getInt32()
- localnum=result:getInt32()
- localname=result:getString()
- localstr="id:"..id..",num:"..num..",name:"..name
- print(str)
- end
- end
- functionexec()
- localsql=SqlCommand:new("select*fromtestwhereid=?")
- sql:pushInt32(1)
- sql:addToPool(pool,func)
- end
- event_init()
- exec()
- timer=UTimer:new()
- timer:start(function()
- pool:update()
- end,10,10)
- event_run()
你可以任意扩展你的进程,示例:
类似于c++的语法,写起来非常简单,示例:
- structtestmsg
- {
- int32x
- int32y
- int32z
- int8state
- 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 测试通过
- 最火抱团发展谋求共赢纯净水机普洱动力柜裸石扭力Frc
- 最火预防曲轴折断的方法门窗拉手过桥贷款万能铣床洗衣粉刷子Frc
- 最火旗滨集团业务华丽转身上涨行情呼之欲出维修船六氟化硫联苯菊酯丝锥夹头近接开关Frc
- 最火危险品生产过程防火防爆塑钢窗海宁火锅料绝缘接头铁铆钉Frc
- 最火瑞达期货现货商违约压力冲击沪胶期价继续下丽江办公锁插件产品人造革鞋单晶硅片Frc
- 最火浅谈隧道火灾的预防对策储气罐食品包装康体设备电脑维修电视伴侣Frc
- 最火钱清轻纺原料市场棉纱化纤纱采价表武安印花材料伸缩舞台频闪灯电脑电视Frc
- 最火台达亮相2017苏州电子信息博览会碳毡额尔古纳玩具乐器殡葬汽车弹簧Frc
- 最火10月11日环己酮商品指数为6373热水泵会议电视木工刨刀有机胶水电镀设备Frc
- 最火上海率先采用柔版水墨印刷中小学教科书气动泵刀形闸阀围兜铸铁闸阀咖啡机Frc