日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
一個(gè)開(kāi)源的服務(wù)器框架,特別適用于開(kāi)發(fā)小游戲

jwEngine

一個(gè)跨平臺(tái)的c++<->lua服務(wù)器快速解決方案,該框架即可快速響應(yīng)服務(wù)器開(kāi)發(fā)工作,設(shè)計(jì)思想:“讓事情變得更簡(jiǎn)單”

網(wǎng)絡(luò)底層采用libuv(node.js底層庫(kù)),異步io助力使單線程也能釋放澎湃動(dòng)力,跨平臺(tái)支持epoll、iocp、ipv6??蚣苤С謙cp、udp/kcp、websocket、http,并保證了接口的一致性,使用了sol2將所有接口都導(dǎo)出到lua,可以選擇用lua開(kāi)發(fā)邏輯。

使用modern c++開(kāi)發(fā),盡可能的使用std::move、std::string_view減少內(nèi)存復(fù)制。

該框架使用異步事件,不建議使用多線程,避免多線程上下文切換開(kāi)銷和破壞代碼美感,網(wǎng)絡(luò)部分和邏輯部分使用一個(gè)主事件循環(huán)驅(qū)動(dòng)。建議的方案是多進(jìn)程單線程的橫向擴(kuò)展,按照業(yè)務(wù)控制各個(gè)進(jìn)程的粒度,當(dāng)然mysql和redis可以加入到線程池中。

創(chuàng)建一個(gè)tcp服務(wù)器

只需要簡(jiǎn)單幾行代碼即可創(chuàng)建一個(gè)tcp高性能服務(wù)器,并自動(dòng)處理數(shù)據(jù)包頭和粘包(其中包頭包含消息長(zhǎng)度和協(xié)議號(hào)),構(gòu)建一個(gè)完好的NetPacket交給你。

 
 
 
  1. class INetEvent : public NetEvent 
  2. public: 
  3.   virtual void onAccept(NetConnect * conn){} 
  4.   virtual void onClose(NetConnect * conn){} 
  5.   virtual void onMsg(NetConnect * conn, int msgtype, NetPacket * pack){} 
  6. }; 
  7.  
  8. int main() 
  9.   EventLoop::Instance()->init(); 
  10.  
  11.   INetEvent eve; 
  12.   NetServer server(EventLoop::Instance(), &eve); 
  13.   server.listen("127.0.0.1", 3001); 
  14.  
  15.   return EventLoop::Instance()->run(); 

創(chuàng)建一個(gè)kcp服務(wù)器

c++的kcp服務(wù)器示例,快速構(gòu)建你的幀同步服務(wù)器,保證消息的可靠性

 
 
 
  1. class KNetEvent : public KcpEvent 
  2. public: 
  3.   virtual void onAccept(KcpSession * conn){}; 
  4.   virtual void onClose(KcpSession * conn){}; 
  5.   virtual void onMsg(KcpSession * conn, int msgtype, UdpPacket * pack){} 
  6.   virtual void onUdpTimeout(KcpSession * s){} 
  7. }; 
  8.  
  9. int main() 
  10.   EventLoop::Instance()->init(); 
  11.  
  12.   KNetEvent eve; 
  13.   KcpServer server(EventLoop::Instance(), &eve); 
  14.   server.start("127.0.0.1", 3001); 
  15.  
  16.   return EventLoop::Instance()->run(); 

創(chuàng)建一個(gè)websocket服務(wù)器

自動(dòng)完成解析websocket協(xié)議工作

 
 
 
  1. class IWebEvent : public WebSocketEvent 
  2. public: 
  3.   virtual void onHandshake(WebSocketConnect * conn){}; 
  4.   virtual void onAccept(WebSocketConnect * conn){}; 
  5.   virtual void onClose(WebSocketConnect * conn){}; 
  6.   virtual void onMsg(WebSocketConnect * conn, WebSocketPacket * pack){}; 
  7. }; 
  8.  
  9. int main() 
  10.   EventLoop::Instance()->init(); 
  11.  
  12.   IWebEvent wevent; 
  13.   WebSocketServer server(EventLoop::Instance(), &wevent); 
  14.   server.listen("127.0.0.1", 8080); 
  15.  
  16.   return EventLoop::Instance()->run(); 

創(chuàng)建一個(gè)http服務(wù)器

http僅支持簡(jiǎn)單的get post請(qǐng)求

 
 
 
  1. const char * html = R"( 
  2.  
  3. login

     
  4. hello world!

     
  5.    
  6.      
  7.      
  8.      
  9.    
  10.  
  11. )"; 
  12.    
  13. const char * succeed = "" 
  14. "" 
  15. "" 
  16. "

    login succeed

  17. "" 
  18. ""; 
  19.  
  20. const char * failing = "" 
  21. "" 
  22. "" 
  23. "

    login failing

  24. "" 
  25. ""; 
  26.  
  27. int main() 
  28.   EventLoop::Instance()->init(); 
  29.   HttpServer server(EventLoop::Instance()); 
  30.   server.listen("127.0.0.1", 80); 
  31.  
  32.   server.addGet("/", [](HttpConnect *conn, std::string_view & data) { 
  33.     conn->autoMsg(html); 
  34.   }); 
  35.  
  36.   server.addPost("/login", [](HttpConnect *conn, std::string_view & data) { 
  37.     HttpParam hp(data); 
  38.     if (hp.getStr("user") == "jw" && hp.getStr("pass") == "1111") 
  39.     { 
  40.       conn->autoMsg(succeed); 
  41.     } 
  42.     else 
  43.     { 
  44.       conn->autoMsg(failing); 
  45.     } 
  46.   }); 
  47.  
  48.   return EventLoop::Instance()->run(); 

mysql和線程池

這次我們用lua示例:

 
 
 
  1. local config = DBConfig:new() 
  2. config.device = "mysql" 
  3. config.ip = "127.0.0.1" 
  4. config.dbname = "jw_test" 
  5. config.user = "root" 
  6. config.pswd = "1111" 
  7. config.port = 3306 
  8.  
  9. pool = DBThreadPool:new(config) 
  10. pool:create(1) 
  11.  
  12. func = function(err, result) 
  13.   while(result:fetch()) 
  14.   do 
  15.     local id = result:getInt32() 
  16.     local num = result:getInt32() 
  17.     local name = result:getString() 
  18.  
  19.     local str = "id:" .. id .. ", num:" .. num .. ", name:" .. name 
  20.     print(str) 
  21.   end 
  22. end 
  23.  
  24. function exec() 
  25.   local sql = SqlCommand:new("select * from test where id = ?") 
  26.   sql:pushInt32(1) 
  27.   sql:addToPool(pool, func) 
  28. end 
  29.  
  30. event_init() 
  31. exec() 
  32. timer = UTimer:new() 
  33. timer:start(function () 
  34.     pool:update() 
  35.   end, 10, 10) 
  36. event_run() 

任意擴(kuò)展進(jìn)程節(jié)點(diǎn)

你可以任意擴(kuò)展你的進(jìn)程,示例:

base進(jìn)程 cell進(jìn)程 db進(jìn)程
start engine.exe base.luastart engine.exe cell.luastart engine.exe db.lua

提供一個(gè)serialization序列化工具

類似于c++的語(yǔ)法,寫(xiě)起來(lái)非常簡(jiǎn)單,示例:

 
 
 
  1. struct testmsg 
  2.   int32 x 
  3.   int32 y 
  4.   int32 z 
  5.   int8 state 
  6.   vector vec 
  7.    
  8.   read{ 
  9.     [x, y, z, state] 
  10.     if(state == 1) 
  11.     { 
  12.       [vec] 
  13.     } 
  14.   } 
  15.   write{ 
  16.     [x, y, z, state, vec] 
  17.   } 

通過(guò)serialization工具可以將協(xié)議的描述文件生成c++和lua代碼,自動(dòng)生成read()和write()的函數(shù)實(shí)現(xiàn),使得數(shù)據(jù)結(jié)構(gòu)快速映射到SocketBuffer中。

目前serialization序列化工具為實(shí)驗(yàn)性,可能是脆弱的,建議使用更強(qiáng)大的protobuf。該項(xiàng)目已集成lua-protobuf,使得c++和lua之間的協(xié)議無(wú)縫銜接。

lua-protobuf的開(kāi)源地址: lua-protobuf

這個(gè)示例展示了c++客戶端和lua服務(wù)器之間的通訊: 快速搭建服務(wù)器Demo

構(gòu)建

你需要一個(gè)modern c++17編譯器

  • vs2017 測(cè)試通過(guò)
  • gcc version 9.3.0 測(cè)試通過(guò)

網(wǎng)站名稱:一個(gè)開(kāi)源的服務(wù)器框架,特別適用于開(kāi)發(fā)小游戲
標(biāo)題路徑:http://m.5511xx.com/article/dhdcicj.html