記一次學習skynet中的C/Lua接口編程解析protobuf過程

1.引言

? ? ? ? 最近在學習skynet過程中發現在網絡收發數據的過程中數據都是裸奔,就想加入一種數據序列化方式,json、xml簡單好用,但我就是不想用,于是就想到了protobuf,對于protobuf C/C++的使用個人感覺有點重,正好在學Lua,就想著能不能通過Lua來處理這些業務邏輯,C/C++只負責底層功能,最開始是想自己通過C實現一個動態庫給Lua調用,但是后來估算了一下工作量,怕自己走火入魔果斷放棄,于是就去github尋找靈感,于是找到了lua-protobuf,OK有輪子了,不想再造了,直接用。

2.組織工程

? ? ? ? 現在來到第一步,創建echo工程。

mkdir echo && cd echo

? ? ? ? ?第二步:拉取skynet項目到工作目錄并構建。

git clone https://github.com/cloudwu/skynet.gitcd skynetgit submodule initgit submodule updatemake PLAT=linux

? ? ? ? 第三步:拉取lua-protobuf到工作目錄并構建。

git clone https://github.com/starwing/lua-protobuf.gitcd lua-protobufmkdir build && cd buildcmake ..make

? ? ? ? ?最后,這是我的現有工程結構,如下圖。

? ? ? ? ?OK,準備工作已經完畢,開始煉丹...

3.無內鬼可以煉丹

? ? ? ? 所有自己的Lua代碼都會放在lua?-src目錄,現在基于skynet創建一個echo服務,代碼如下

-- main.lua
local skynet = require "skynet"
local socket = require "skynet.socket"
local pb = require "pb"
local serpent = require "serpent"local function load_proto_file(filepath)pb.loadfile(filepath)
endlocal function sendto(clientfd, arg)socket.write(clientfd, arg)
endlocal function client_quit(clientfd)socket.close(clientfd)
endlocal function accept(clientfd, addr)socket.start(clientfd)local data = socket.read(clientfd)if not data thenclient_quit(clientfd)returnendlocal res = {token = "aaaaaaaaa"}-- 解碼接收到的數據local dedata = pb.decode("Login.LoginRequest", data)print("recv : ", serpent.block(dedata))-- 將lua原表編碼成protobuf的二進制數據local tmp = pb.encode("Login.LoginResponse", res)   print("send : ", serpent.block(tmp))sendto(clientfd, tmp)socket.close(clientfd)
endlocal function main()-- 為了簡單直接絕對路徑寫死load_proto_file("/home/oyj/game/echo/Login.pb")local listenfd = socket.listen("0.0.0.0", 8888)socket.start(listenfd, accept)
endskynet.start(main)

? ? ? ? 代碼寫完,開始寫配置文件,在項目根目錄寫一個配置文件,如下:

thread=4
logger=nil
harbor=0
start="main"
-- 這里吧lua-protobuf的Lua文件路徑告訴skynet
lua_path="./skynet/lualib/?.lua;./skynet/lualib/?/init.lua;./lualib/?.lua;./lua-protobuf/?.lua"
-- 我們下的lua代碼在這里配置加載路徑
luaservice="./skynet/service/?.lua;./lua-src/?.lua;"
lualoader="./skynet/lualib/loader.lua"
-- 配置lua-protobuf動態庫的路徑,讓skynet可以加載到動態庫
cpath="./skynet/cservice/?.so;./lua-protobuf/build/?.so"
lua_cpath="./skynet/luaclib/?.so;./lua-protobuf/build/?.so"

? ? ? ? 再寫一個proto文件:

// Login.proto
syntax = "proto3";
package Login;message LoginRequest {string username = 1;string password = 2;
}message LoginResponse {string token = 1;
}

? ? ? ? 最后將proto文件生成Lua要的pb文件。

protoc -I . -o Login.pb Login.proto

? ? ? ? 最后找個之前客戶端來測試,整體代碼太多就不全部貼出來了,相信能看到這你是有點東西的,自己寫應該簡簡單單,大概代碼如下:

? ? ? ? 最最后目前的項目結構:

4.開始試丹?

? ? ? ? 丹成!!!命令行進入工程根目錄運行一下命令開始試丹!

./skynet/skynet config

? ? ? ? ?skynet啟動成功,效果如下:

? ? ? ? 發個數據測試一下:

? ? ? ? client:

? ? ? ? server:

? ? ? ? OK,丹沒毒放心食用?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/65806.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/65806.shtml
英文地址,請注明出處:http://en.pswp.cn/web/65806.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SQLAlchemy

https://docs.sqlalchemy.org.cn/en/20/orm/quickstart.htmlhttps://docs.sqlalchemy.org.cn/en/20/orm/quickstart.html 聲明模型 在這里,我們定義模塊級構造,這些構造將構成我們從數據庫中查詢的結構。這種結構被稱為 聲明式映射,它同時定…

Trimble自動化激光監測支持歷史遺產實現可持續發展【滬敖3D】

故事橋(Story Bridge)位于澳大利亞布里斯班,建造于1940年,全長777米,橫跨布里斯班河,可載汽車、自行車和行人往返于布里斯班的北部和南部郊區。故事橋是澳大利亞最長的懸臂橋,是全世界兩座手工建…

CentOS 和 Ubantu你該用哪個

文章目錄 **一、CentOS 和 Ubuntu 的詳細介紹****1. CentOS****1.1 基本信息****1.2 特點****1.3 缺點** **2. Ubuntu****2.1 基本信息****2.2 特點****2.3 缺點** **二、CentOS 和 Ubuntu 的異同****1. 相同點****2. 不同點****3. 使用體驗對比** **三、總結和選擇建議** Cent…

Android RIL(Radio Interface Layer)全面概述和知識要點(3萬字長文)

在Android面試時,懂得越多越深android framework的知識,越為自己加分。 目錄 第一章:RIL 概述 1.1 RIL 的定義與作用 1.2 RIL 的發展歷程 1.3 RIL 與 Android 系統的關系 第二章:RIL 的架構與工作原理 2.1 RIL 的架構組成 2.2 RIL 的工作原理 2.3 RIL 的接口與協議…

前端學習-事件對象與典型案例(二十六)

目錄 前言 事件對象 目標 事件對象是什么 語法 獲取事件對象 部分常用屬性 示例代碼 示例代碼:評論回車發布 總結 前言 長風破浪會有時,直掛云帆濟滄海。 事件對象 目標 能說出什么是事件對象 事件對象是什么 也是個對象,這個對…

Playwright vs Selenium:全面對比分析

在現代軟件開發中,自動化測試工具在保證應用質量和加快開發周期方面發揮著至關重要的作用。Selenium 作為自動化測試領域的老牌工具,長期以來被廣泛使用。而近年來,Playwright 作為新興工具迅速崛起,吸引了眾多開發者的關注。那么…

Windows 程序設計3:寬窄字節的區別及重要性

文章目錄 前言一、寬窄字節簡介二、操作系統及VS編譯器對寬窄字節的編碼支持1. 操作系統2. 編譯器 三、寬窄字符串的優缺點四、寬窄字節數據類型總結 前言 Windows 程序設計3:寬窄字節的區別及重要性。 一、寬窄字節簡介 在C中,常用的字符串指針就是ch…

進階——十六屆藍橋杯嵌入式熟練度練習(LED的全開,全閉,點亮指定燈,交替閃爍,PWM控制LED呼吸燈)

點亮燈的函數 void led_show(unsigned char upled) { HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOC,upled<<8,GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RE…

力扣 最大子數組和

動態規劃&#xff0c;前綴和&#xff0c;維護狀態更新。 題目 從題可以看出&#xff0c;找的是最大和的連續子數組&#xff0c;即一個數組中的其中一個連續部分。從前往后遍歷&#xff0c;每遍歷到一個數可以嘗試做疊加&#xff0c;注意是嘗試&#xff0c;因為有可能會遇到一個…

Homestyler 和 Tripo AI 如何利用人工智能驅動的 3D 建模改變定制室內設計

讓設計夢想照進現實 在Homestyler,我們致力于為每一個夢想設計師提供靈感的源泉,而非挫折。無論是初學者打造第一套公寓,或是專業設計師展示作品集,我們的直觀工具都能讓您輕松以驚人的3D形式呈現空間。 挑戰:實現定制設計的新紀元 我們知道,將個人物品如傳家寶椅子、…

如何當前正在運行的 Elasticsearch 集群信息

要查看當前正在運行的 Elasticsearch 集群信息&#xff0c;可以通過以下幾種方法&#xff1a; 1. 使用 _cluster/health API _cluster/health API 返回集群的健康狀態、節點數量、分片狀態等信息。可以用 curl 命令直接訪問&#xff1a; curl -X GET "http://localhost…

算法練習4——一個六位數

這道題特別妙 大家仔細做一做 我這里采用的是動態規劃來解這道題 結合題目要求找出數與數之間的規律 抽象出狀態轉移方程 題目描述 有一個六位數&#xff0c;其個位數字 7 &#xff0c;現將個位數字移至首位&#xff08;十萬位&#xff09;&#xff0c;而其余各位數字順序不…

client-go 的 QPS 和 Burst 限速

1. 什么是 QPS 和 Burst &#xff1f; 在 kubernetes client-go 中&#xff0c;QPS 和 Burst 是用于控制客戶端與 Kubernetes API 交互速率的兩個關鍵參數&#xff1a; QPS (Queries Per Second) 定義&#xff1a;表示每秒允許發送的請求數量&#xff0c;即限速器的平滑速率…

B-tree 數據結構詳解

1. 引言 1.1 什么是 B-tree&#xff1f; B-tree&#xff08;Balanced Tree&#xff0c;平衡樹&#xff09;是一種自平衡的多路搜索樹數據結構&#xff0c;其核心特性包括&#xff1a; 多路性&#xff1a; 每個節點可以包含多個關鍵字和子節點&#xff0c;而非僅二分。平衡性…

Python 正則表達式完全指南

# Python 正則表達式完全指南 正則表達式&#xff08;Regular Expression&#xff09;是Python中進行文本處理的強大工具。本指南將詳細介紹Python中正則表達式的使用方法和實踐技巧。 ## 1. 基礎知識 ### 1.1 導入正則表達式模塊 python import re ### 1.2 創建正則表達式 在…

Vue的scoped原理是什么

CSS常見模塊化方案 BEM&#xff08;Block Element Modifier&#xff09;: BEM是一種流行的命名約定&#xff0c;它通過特定的命名規則來組織CSS類名&#xff0c;使得樣式具有模塊化、可重用性和可讀性。BEM的命名規則是&#xff1a;block__element--modifier。 block&#xf…

【LC】3270. 求出數字答案

題目描述&#xff1a; 給你三個 正 整數 num1 &#xff0c;num2 和 num3 。 數字 num1 &#xff0c;num2 和 num3 的數字答案 key 是一個四位數&#xff0c;定義如下&#xff1a; 一開始&#xff0c;如果有數字 少于 四位數&#xff0c;給它補 前導 0 。答案 key 的第 i 個數…

太原理工大學軟件設計與體系結構 --javaEE

這個是簡答題的內容 選擇題的一些老師會給你們題庫&#xff0c;一些注意的點我會做出文檔在這個網址 項目目錄預覽 - TYUT復習資料:復習資料 - GitCode 希望大家可以給我一些打賞 什么是Spring的IOC和DI IOC 是一種設計思想&#xff0c;它將對象的創建和對象之間的依賴關系…

深度學習知識點:LSTM

文章目錄 1.應用現狀2.發展歷史3.基本結構4.LSTM和RNN的差異 1.應用現狀 長短期記憶神經網絡&#xff08;LSTM&#xff09;是一種特殊的循環神經網絡(RNN)。原始的RNN在訓練中&#xff0c;隨著訓練時間的加長以及網絡層數的增多&#xff0c;很容易出現梯度爆炸或者梯度消失的問…

mmdet

一&#xff0c;configs/_base_ 1.default_runtime.py 2.schedule_1x.py 二&#xff0c;mmdet 1.datasets/coco.py/CocoDataset METAINFO {classes:(milk, red, spring, fanta, sprite, pepsi, king, ice, cola, scream ),# palette is a list of color tuples, which is us…