云风在skynet中继承了sproto的传输协议,对比protobuf的好处是,能明文看到传输内容,而且skynet不需要protobuf这么功能,所以云风也建议在lua层使用sproto来作为skynet的传输协议。

在examples文件夹中的agent.lua中有用到sproto的例子。下面讲解一下sproto的使用过程和原理:

proto.lua的文件中包含一个实例协议:

 local sprotoparser = require "sprotoparser"

 local proto = {}

 proto.c2s = sprotoparser.parse [[
.package {
type 0 : integer
session 1 : integer
} handshake 1 {
response {
msg 0 : string
}
} get 2 {
request {
what 0 : string
}
response {
result 0 : string
}
} set 3 {
request {
what 0 : string
value 1 : string
}
} quit 4 {} ]] proto.s2c = sprotoparser.parse [[
.package {
type 0 : integer
session 1 : integer
} heartbeat 1 {}
]] return proto

proto.c2s是客户端发送个服务端的协议,proto.s2c是服务端发送客户端的协议。

sproto的协议变量类型有integer、string、boolean。sproto协议也可以实现结构体和数组、字典。

结构体的实现可以仿造.package,结构体开头必须是以“.”开头,"."后面的是结构体的名字,

字典和数组的实现是类似于c指针,例子如下:

 local s2c = [[

 protoName 1 {

   request {

     arg1 0 :integer

     arg2 1 :*value(key)

   }

 }

 ]]

如果服务端要发送玩家拥有的角色信息的数组,key就是角色数组的索引数据类型,如果角色数组的索引是角色id的话,id类型是integer类型,那么key就是“integer”,

value是角色数组的头元素。

sproto协议中也可以加注释:在注释内容前加上“#”符号。

sprotoparser.parse是通过sprotoparser.lua中的parse方法将协议解析成一个table,过程需要用到lpeg的库来进行匹配。笔者到现在还没弄懂这个parse过程,哈哈。。。

首先看看client.lua中的sproto的实现过程,

local sproto = require "sproto"

local host = sproto.new(proto.s2c):host "package"

local request = host:attach(sproto.new(proto.c2s))

sproto.new(proto.s2c):将proto.s2c闯入sproto.lua中,通过c的lsproto.c文件中的newproto方法将协议数据保存在sproto结构体中,sproto协议作为全局变量,一般情况下不需要gc,

最后返回一个sproto的table,具体实现还是要看看sproto.lua文件比较好理解。

host("package")是返回的sproto的table中查找“package”包头,也就是.package结构体,和一些host的方法保存在一个新的table中,这个有点难理解,所以还是看看实现过程。

host:attach(sproto.new(proto.c2s))是通过上一步返回包头协议,绑定在c2s的协议,返回一个负责打包协议的函数体,每次调用该函数时,传入要打包的协议名,参数,和session就可以

得到一个协议结构体,例如:

 send_request("set", { what = "hello", value = "world" })

skynet 学习笔记-sproto模块(2)的更多相关文章

  1. skynet 学习笔记-netpack模块(1)

    int luaopen_netpack(lua_State *L) { luaL_checkversion(L); luaL_Reg l[] = { { "pop", lpop } ...

  2. Python学习笔记—itertools模块

    这篇是看wklken的<Python进阶-Itertools模块小结> 学习itertools模块的学习笔记 在看itertools中各函数的源代码时,刚开始还比较轻松,但后面看起来就比较 ...

  3. Python学习笔记之模块与包

    一.模块 1.模块的概念 模块这一概念很大程度上是为了解决代码的可重用性而出现的,其实这一概念并没有多复杂,简单来说不过是一个后缀为 .py 的 Python 文件而已 例如,我在某个工作中经常需要打 ...

  4. Python3学习笔记25-logging模块

    logging模块,Python自带用来记录日志的模块. 因为工作需要用到关于日志的,最近一直都在看关于日志模块的东西,百度了很多文章,可惜都是看的让人一头雾水,最后运气不错,找到一篇很详细的文章.传 ...

  5. Scikit-Learn模块学习笔记——数据集模块datasets

    scikit-learn 的 datasets 模块包含测试数据相关函数,主要包括三类: datasets.load_*():获取小规模数据集.数据包含在 datasets 里 datasets.fe ...

  6. node 学习笔记 - Modules 模块加载系统 (1)

    本文同步自我的个人博客:http://www.52cik.com/2015/12/11/learn-node-modules-path.html 用了这么久的 require,但却没有系统的学习过 n ...

  7. python学习笔记五 模块上(基础篇)

    模块学习 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要 ...

  8. 网上图书商城项目学习笔记-011Book模块查询(分页)

    一.流程分析 1.图书模块 2.分布分析 二.代码 1.view层 1)list.jsp <%@ page language="java" import="java ...

  9. angular2 学习笔记 ( ngModule 模块 )

    2016-08-25, 当前版本是 RC 5. 参考 : https://angular.cn/docs/ts/latest/guide/ngmodule.html 提醒 : 这系列笔记的 " ...

随机推荐

  1. 2017-8-31 NOIP模拟赛

    可接受序列 [题目描述] 让计算机这样读入一列非负整数: 1.读入数T. 2.接着往下读入T个数. 3.如果数列读完了,则停止,否则,转到1. 但是,往往会出现这样的问题:执行第2步时,数列已经没有T ...

  2. codevs 3342绿色通道

    3342 绿色通道  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 黄金 Gold

  3. Python之for循环和while循环

    Python中有两种循环,分别为:for 循环和 while 循环. 循环语句就是在某种条件下,循环的执行某段代码块,并在符合条件的情况下跳出该段循环, 其目的是处理想要进行处理的相同任务.它的关键词 ...

  4. Postgresql 10 自带扩展模块功能说明

    adminpackadminpack提供了许多支持功能,pgAdmin 和其他管理和管理工具可以使用它们来提供其他功能,例如远程管理服务器日志文件.所有这些功能的使用仅限于超级用户. citext 该 ...

  5. thinkphp5部署到LAMP服务器显示Access denied.

    问题:thinkphp5部署到LAMP服务器,首页正常访问,其余页面访问显示Access denied 解决:1.先把文件夹权限改为777 2. 进入服务器,改文件.将php.ini的值改成1

  6. HTML5----前段各种常见BUG

     1.在IE6下,DIV中的字会多出,并且自成一行,而且是原来的字. 这是注释bug,经典的ie6 bug.    说明:注释造成文字溢出是IE6的BUG,注释造成文字溢出与其位置有关,注释造成文字溢 ...

  7. Codeforces #564div2 E1(记忆化搜索)

    虽然不是正解但毕竟自己做出来了还是记下来吧- 对每个人分别dfs得到其期望,某两维的组合情况有限所以Hash一下避免了MLE. #include <cstdio> #include < ...

  8. PHP EXCEL相关

    这次的需求是在二次扫描的EXCEL报表中加入一列扫描时间. 扫描的时间之前已经写进日志里了,这次要做的就是把时间读取出来然后作为一列插入报表.其实日志也已经读出来了,要做的就是插入.但插入还是碰到不少 ...

  9. EF 记录执行的sql语句

    最近做了个中等的项目,数据不会很多,开发时间比较紧迫,所以用了EF的框架. 在使用过程中,发现有时候执行的结果不如预期,想看看执行的sql语句为何,遍查找资料,在网上找到了相关辅助类,拿来使用,部署到 ...

  10. display:none和visibility:hidden v-show和v-if的区别

    隐藏元素display:none 和 visibility:hidden的区别visibility:hidden可以隐藏某个元素,但是隐藏的元素仍要占据空间,仍要影响布局display:none不会占 ...