记一次学习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,丹没毒放心食用
相关文章:
记一次学习skynet中的C/Lua接口编程解析protobuf过程
1.引言 最近在学习skynet过程中发现在网络收发数据的过程中数据都是裸奔,就想加入一种数据序列化方式,json、xml简单好用,但我就是不想用,于是就想到了protobuf,对于protobuf C/C的使用个人感觉有点重,正好…...
JavaSE面试
final和static对比 static知识点介绍static代码块当JVM加载类时,static代码块会且只会被执行一次。可用于优化程序性能。实例代码块在每次创建对象时,都会自动执行。static方法static方法中不能使用this和super关键字。静态内部类静态内部类的创建不需要…...
【Rust自学】11.10. 集成测试
喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 11.10.1. 什么是集成测试 在Rust里,集成测试完全位于被测试库的外部。集成测试调用库的方式和其他代码一样,这也…...
Redis :redis的大Key问题
问题 : 什么是redis 的大key 呢? redis 是一个单线程应用程序。他的请求类似于队列处理,命令排队执行,逐个处理。 这样就会出现一个问题,一旦队列前面的命令请求处理时间过程,那么后续执行命令就会被迫的等…...
IntelliJ IDEA中Maven项目的配置、创建与导入全攻略
大家好,我是袁庭新。 IntelliJ IDEA是当前最流行的Java IDE(集成开发环境)之一,也是业界公认最好用的Java开发工具之一。IntelliJ IDEA支持Maven的全部功能,通过它我们可以很轻松地实现创建Maven项目、导入Maven项目、…...
如何确保获取的淘宝详情页数据的准确性和时效性?
要确保获取的淘宝详情页数据的准确性和时效性,可从以下几个方面着手: 合法合规获取数据 遵守平台规则:在获取淘宝详情页数据之前,务必仔细阅读并严格遵守淘宝平台的使用协议和相关规定。明确哪些数据可以获取、以何种方式获取以及…...
如何将json字符串格式化
文章目录 如何对json字符串进行格式化显示hutool方案的示例和不足使用fastjson的方案 如何对json字符串进行格式化显示 将json字符串内容进行格式化的输出显示。本文介绍 hutool的方案和alibaba 的fastjson方案 hutool方案的示例和不足 引入依赖 <dependency><grou…...
【Vue + Antv X6】可拖拽流程图组件
使用事项: ❗先放个组件上来,使用手册有空会补全 ❗需要下载依赖 “antv/x6”: “^2.18.1”, “antv/x6-plugin-dnd”: “^2.1.1”, 组件: 组件使用: <flowChart :key"flowChartKey" ref"flowChart" lef…...
反转链表题目
文章目录 反转链表题目链接:[在线OJ](https://leetcode.cn/problems/reverse-linked-list/description/)题目详解思路1:思路1算法复杂度 思路2代码实现思路2算法复杂度 结语 欢迎大家来到我的博客,给生活来点impetus 让我们进入《题海探骊》…...
利用Python爬虫获取义乌购店铺所有商品列表:技术探索与实践
在当今数字化时代,数据的重要性不言而喻。对于采购商而言,能够快速、准确地获取供应商店铺内的所有商品信息,是提升采购效率、优化采购决策的关键。义乌购作为国内知名的在线批发平台,汇聚了海量的商品资源,为采购商提…...
基于FPGA的多功能数字钟设计
基于FPGA的多功能数字钟设计 前言基础知识按键数码管 系统概述按键使用说明模块描述模块设计button_debouncebutton_controllerclock_controllerdigital_tube 整体资源用量测试视频 前言 本工程主要是数码管、按键、LED的应用开发。 注:本工程所有IP均使用源码开发…...
nginx-lua模块安装
一.简述 安装 Nginx 的 Lua 模块(通常指的是 ngx_lua 模块)可以显著增强 Nginx 的功能,使其能够执行 Lua 脚本。这使得 Nginx 可以处理更复杂的逻辑和动态内容生成。以下是详细的安装步骤,包括安装 OpenResty 或从源码编译 Nginx…...
poi处理多选框进行勾选操作下载word以及多word文件压缩
一、场景 将数据导出word后且实现动态勾选复选框操作 eg: word模板 导出后效果(根据数据动态勾选复选框) 二、解决方案及涉及技术 ① 使用poi提供的库进行处理(poi官方文档) ② 涉及依赖 <!-- excel工具 --><depen…...
centos7.3安装部署freeswitch
centos7.3安装部署freeswitch 切换yum源为阿里镜像源安装 FreeSWITCH 的 YUM 软件仓库配置文件和 EPEL安装相关工具安装cmake源码编译安装依赖安装 freeswitch 切换yum源为阿里镜像源 cp -r /etc/yum.repos.d /etc/yum.repos.d.bakcurl -o /etc/yum.repos.d/CentOS-Base.repo …...
C# 迭代,递归,回调--13
目录 一.迭代 迭代器示例: 关键点: 优势: 二.递归 递归示例: 关键点: 优势: 注意: 三.回调 回调示例: 关键点: 优势: 应用场景: 4.三种模式的特点对比: 迭代: 递归: 回调: 一.迭代 在C#中迭代通常指重复执行一系列指令 在C#中,迭代器是一种特殊的结构,允许…...
MOS管为什么会有夹断,夹断后为什么会有电流?该电流为什么是恒定的?
以下是对MOS管MOS管为什么会有夹断,夹断后为什么还会有电流?该电流为什么是恒定的?的一些心得体会。 1. MOS管为什么会有夹断? 可以认为D极加压使得D极的耗尽层增大(原因是N极接正极,P极接负极,电子被吸引…...
3D可视化产品定制,应用于哪些行业领域?
3D可视化定制服务已广泛渗透至众多行业领域,包括汽车、家居、时尚鞋服、珠宝配饰以及数码电器等: 汽车行业: 借助Web全景技术与3D模型,我们高保真地再现了汽车外观,为用户带来沉浸式的车型浏览体验。用户可在展示界面自…...
Golang 简要概述
文章目录 1. Golang 的学习方向2. Golang 的应用领域2.1 区块链的应用开发2.2 后台的服务应用2.3 云计算/云服务后台应用 1. Golang 的学习方向 Go 语言,我们可以简单的写成 Golang 2. Golang 的应用领域 2.1 区块链的应用开发 2.2 后台的服务应用 2.3 云计算/云服…...
PL/SQL语言的文件操作
PL/SQL语言的文件操作 PL/SQL(Procedural Language/SQL)是Oracle公司开发的一种过程化扩展SQL的语言,广泛应用于Oracle数据库的开发和管理。PL/SQL不仅支持SQL指令,还支持过程化编程,例如条件控制、循环控制、异常处理…...
python判断当前时间是否是每月10号上午
以下是一个 Python 脚本,用于判断当前时间是否是每月 10 号的上午: from datetime import datetime# 获取当前时间 now datetime.now()# 检查是否是每月 10 号的上午 if now.day 10 and now.hour < 12:print("当前时间是每月10号上午。"…...
【MT32F006】MT32F006之max17048电量计(IIC通信)
本文最后修改时间:2025年01月09日 一、本节简介 本文介绍如何使用MT32F006通过IIC与电量计max17048通信。 二、实验平台 库版本:V1.0.0 编译软件:MDK5.37 硬件平台:MT32F006开发板(主芯片MT32F006) 仿…...
使用python生成gif图
使用PyCharm软件,然后pip install imageio 之后代码如下 import imageio.v2 as imageio# 合成 gif 方法 def compose_gif():img_path ["D:\\picture\\R-CA.jpg", "D:\\picture\\R-C.jpg","D:\\picture\\R-C.jpg", "D:\\pict…...
pytorch小记(一):pytorch矩阵乘法:torch.matmul(x, y)
pytorch小记(一):pytorch矩阵乘法:torch.matmul(x, y)/ x y 代码代码 1:torch.matmul(x, y)输入张量:计算逻辑:输出结果: 代码 2:y y.view(4,1)…...
CF 368A.Sereja and Coat Rack(Java实现)
问题分析 简而言之,小明要邀请m个绅士到家,家里有n个挂衣钩,一个挂衣钩要支付i元,如果挂衣钩不够了就要给每个绅士赔d元 思路分析 所以思路就很清楚了,获取n,d,m的值,并用数组存放每…...
HBuilderX打包ios保姆式教程
1、登录苹果开发者后台并登录已认证开发者账号ID Sign In - Apple 2、创建标识符(App ID)、证书,描述文件 3、首先创建标识符,用于新建App应用 3-1、App的话直接选择第一个App IDs,点击右上角继续 3-2、选择App&#x…...
【SOC 芯片设计 DFT 学习专栏 -- DFT 接管 clock 和 reset】
文章目录 OverviewDFT 接管 Clock 和 Reset 的方法Clock 接管方法Reset 接管方法 什么场景下需要 DFT 来接管 Clock 和 Reset?制造测试(Manufacturing Test)静态路径扫描测试(Scan Testing)调试与故障定位(…...
浅谈云计算07 | 云安全机制
浅谈云计算安全机制:全方位守护云端世界 一、引言二、加密技术:数据的隐形护盾三、散列机制:数据完整性的忠诚卫士四、数字签名:数据来源与真伪的鉴定专家五、公钥基础设施(PKI):信任的基石六、…...
PyTorch 深度学习框架快速入门 (小土堆)
PyTorch 深度学习框架快速入门 深度学习框架常用模块数据集存取图片数据处理库 —— PILOS 模块实例 Tensorboard 记录机器学习的过程Transform 进行图像变换数据集的下载DataLoaderModule 自定义网络前向传播卷积层卷积简单应用 最大池化非线性层线性层 简单的整合基于现有网络…...
React Native Hooks开发指南
一、什么是Hooks Hooks 是 React 16.8 的新增特性。在不编写 class 的情况下使用 state 以及其他的 React 特性。Hooks 是一种在函数式组件中使用有状态函数的方法。 二、类组件 componentDidMount、componentDidUpdate 和 componentWillUnmount 这三个函数的组合。 三、常用…...
Java内存与缓存
Java内存管理和缓存机制是构建高性能应用程序的关键要素。它们之间既有联系又有区别,理解这两者对于优化Java应用至关重要。 Java 内存模型 Java内存模型(JMM)定义了线程如何以及何时可以看到其他线程修改过的共享变量的值,并且规…...
两分钟解决 :![rejected] master -> master (fetch first) , 无法正常push到远端库
目录 分析问题的原因解决 分析问题的原因 在git push的时候莫名遇到这种情况 若你在git上修改了如README.md的文件。由于本地是没有README.md文件的,所以导致 远端仓库git和本地不同步。 将远端、本地进行合并就可以很好的解决这个问题 注意:直接git pu…...
React中ElementFiber对象、WorkInProgress双缓存、ReconcileRenderCommit、第一次挂载过程详解
基础概念 Element对象与Fiber对象 Element对象与Fiber对象 Element 对象 定义 React 的 Element 对象是一个描述用户界面(UI)的普通 JavaScript 对象,通常由 React.createElement 或 JSX 语法生成。 作用 它是 React 应用中的一种描述 …...
【论文阅读】Workload Dependent Performance Evaluation of the Linux 2.6 I/O Schedulers
文章目录 某些背景知识的科普(依赖GPT)GPT简短总结摘要-Abstract引言-Introduction1 I/O Scheduling and the BIO LayerThe 2.6 Deadline I/O Scheduler2.1 The 2.6 Anticipatory I/O scheduler2.2 The 2.6 CFQ Scheduler2.3 The 2.6 noop I/O scheduler…...
macOS 版本对应 Xcode 版本,以及 Xcode 历史版本下载
注:当前页面的所有Xcode下载链接均为苹果官方下载链接 ,点击将直接转至苹果官网下载。❤️❤️❤️ Xcode官网:Xcode Releases | xcodereleases.com Xcode版本Xcode发布时间对应macOS版本macOS SDKsiOS SDKswatchOS SDKstvOS SDKs下载Xcode发…...
量子计算:从薛定谔的猫到你的生活
文章背景 说到量子计算,不少人觉得它神秘又遥不可及。其实,它只是量子物理学的一个“应用小分支”。它的核心在于量子比特的“叠加”和“纠缠”,这些听上去像科幻小说的概念,却为计算世界开辟了一片全新的天地。如果经典计算是“…...
R4-LSTM学习笔记
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 LSTM-火灾温度预测 导入数据数据可视化设置X、y构建模型调用模型个人总结LSTM 的基本结构细胞状态(Cell State)LSTM 的优点 导入数据 i…...
Facebook 隐私变革之路:回顾与展望
在数字时代,个人隐私的保护一直是社交平台面临的重大挑战之一。作为全球最大的社交网络平台,Facebook(现为Meta)在处理用户隐私方面的变革,历经了多次调整与完善。本文将回顾Facebook在隐私保护方面的历程,…...
计算机网络 (40)域名系统DNS
前言 计算机网络域名系统DNS(Domain Name System)是互联网的基础技术之一,它负责将人类可读的域名转换为计算机用来通信的数字IP地址。 一、基本概念 DNS的主要目的是将域名解析或翻译为IP地址,使得用户可以通过简单易记的域名来访…...
LabVIEW驱动电机实现样品自动搜索
利用LabVIEW控制电机驱动相机在XY平面上进行扫描,以检测样品位置。样品最初可能位于相机视野范围之外,需要实现自动搜索样品位置并完成精确定位扫描的功能。该系统需具有以下特点: 高效搜索:能够快速确定样品位置,缩短…...
程序员独立开发竞品分析:确定网站使用什么建站系统
要确定一个网站使用的建站系统,可以通过以下几种方法尝试分析: 查看页面源代码: 打开网站,右键点击页面并选择“查看页面源代码”。在代码中查找一些常见的建站系统标志,例如: WordPress 的迹象:…...
计算机网络 笔记 网络层1
网络层功能概述 主要的任务是把分组从源端传输到目的端,为分组交换网上的不同主句提供通信服务,网络层的传输单位是数据报。 主要的功能; 1,路由选择:路由选择指网络层根据特定算法,为数据包从源节点到目…...
推理规则库的构建与应用
目录 前言1. 推理规则库概述1.1 推理规则的基本构成1.2 推理规则库的作用与意义 2. 推理规则库的构建2.1 知识获取与表示2.2 推理规则的提取2.3 规则的优化与整合 3. 推理规则库的推理机制3.1 前向推理3.2 后向推理3.3 混合推理 4. 推理规则库的应用4.1 医学领域4.2 金融领域4.…...
深度学习|表示学习|一个神经元可以干什么|02
如是我闻: 如果我们只有一个神经元(即一个单一的线性或非线性函数),仍然可以完成一些简单的任务。以下是一个神经元可以实现的功能和应用: 1. 实现简单的线性分类 输入:一组特征向量 x x x 输出ÿ…...
2 XDMA IP中断
三种中断 1. Legacy 定义:Legacy 中断是传统的中断处理方式,使用物理中断线(例如 IRQ)来传递中断信号。缺点: 中断线数量有限,通常为 16 条,限制了可连接设备的数量。中断处理可能会导致中断风…...
什么是负载均衡?NGINX是如何实现负载均衡的?
大家好,我是锋哥。今天分享关于【什么是负载均衡?NGINX是如何实现负载均衡的?】面试题。希望对大家有帮助; 什么是负载均衡?NGINX是如何实现负载均衡的? 1000道 互联网大厂Java工程师 精选面试题-Java资源…...
AWS简介
AWS 一,AWS是什么? AWS的全称是 Amazon Web Services 的缩写,是亚马逊公司提供的一套广泛且应用广泛的云端服务。 AWS提供了超过200项全功能的服务,来自数据中心数据中心遍布全球多个地理位置,这些服务包括计算能力&…...
旅游网站设计与实现
文末附有完整项目代码 在当今数字化时代,旅游网站成为人们获取旅游信息的重要途径。本文将详细介绍旅游网站的设计与实现,让你轻松了解其中的技术奥秘! 一、项目背景 随着社会经济的发展,人们对精神消费愈发重视,旅游…...
vscode 扩展Cline、Continue的差别?
Cline和Continue都是VSCode的AI编程插件,它们在功能、用户体验、性能、适用场景以及配置和使用步骤等方面存在一些差别: 一、功能差异 编辑功能 Cline:能够分析项目的文件结构和源代码抽象语法树(AST),通…...
用 HTML5 Canvas 和 JavaScript 实现雪花飘落特效
这篇文章将带您深入解析使用 HTML5 Canvas 和 JavaScript 实现动态雪花特效的代码原理。 1,效果展示 该效果模拟了雪花从天而降的动态场景,具有以下特点: 雪花数量、大小、透明度和下落速度随机。雪花会在屏幕底部重置到顶部,形成循环效果。随窗口大小动态调整,始终覆盖…...
电梯系统的UML文档01
Lu Luo 著,王君 译 1 简介 这是一份Carnegie Mellon 大学博士课程(分布式嵌入系统)项目报告。整个课程完成了一个分布式实时系统的设计、搭建和模拟。设计时用到了OOA 和OOD,特别是UML。 系统的大多数类省略了很多细节。现在看…...