本文總結多年頁遊/手遊服務器開發經驗,採用Lua腳本驅動業務邏輯,C/C++實現高性能網絡通訊與數據庫訪問兩大核心擴展的架構模式。
+--------------------------+ | Lua Script Layer | <-- 業務邏輯、協議處理、配置熱更 +--------------------------+ | C/C++ Extension Layer | <-- Net(epoll/kcp) + DB(mysql/redis driver) +--------------------------+ | OS / Hardware | +--------------------------+
// 返回 net 對象,支援異步回調
Net* _connect(const char* ip, int port,
void (*on_connect)(Net*, Net*),
void (*on_close)(Net*, const char*),
int timeout_ms);
Net* _listen(const char* ip, int port,
void (*on_connect)(Net*, Net*),
void (*on_close)(Net*, const char*),
int timeout_ms);
void net_receive(Net* n, int sep1, int sep2, int sep3, int maxlen, void (*on_recv)(Net*, const char*)); void net_send(Net* n, const char* data, int len); void net_close(Net* n);
// 4字節大端長度 + len字節消息體
// 服務端典型收包邏輯
void on_head(Net* n, const char* data) {
uint32_t len = ntohl(*(uint32_t*)data);
net_receive(n, len, on_body); // 繼續讀取消息體
}
void on_body(Net* n, const char* data) {
// 解析處理業務包
net_receive(n, 4, on_head); // 循環等待下一個包頭
}
void on_connect(Net* n, Net* s) { net_receive(n, 4, on_head); }
void on_close(Net* n, const char* msg) { printf("closed: %s\n", msg); }
// 啟動監聽
Net* server = _listen("0.0.0.0", 8080, on_connect, on_close, 60000);
Net* client = _connect("server_ip", 8080, on_connect, on_close, 60000);
net_send(client, &len, 4); // 發送長度
net_send(client, body, len); // 發送消息體
libiop二次開發,適配自定義協議與回調模型。精華在Lua業務層,C/C++只做「薄而快」的基礎設施。後續文章將詳細拆解Lua協議分發、熱更、數據庫連接池等核心模塊。