skynet笔记

文章目录

API查阅

  • Skynet Wiki 几乎列出了全部接口,每个都有用法说明
  • 源码注释:在 skynet/lualib/skynet.lua 里,大部分核心函数的注释非常清晰。

一个独立的 Skynet 服务(Actor)

  • 一个 Lua 文件 + skynet.start + 由 skynet.newservice 加载 = 一个独立的 Skynet 服务(Actor)
  • 新文件套上"标准模式"壳就变成了一个服务:
lua 复制代码
local skynet = require "skynet"
-- ... 引入其他模块

-- 命令处理表
local CMD = {}

function CMD.xxx(...)
    -- 处理 lua 消息
end

-- 消息回调处理客户端连接等
-- ...

skynet.start(function()
    -- 注册 lua 消息分发
    skynet.dispatch("lua", function(session, source, cmd, ...)
        local f = CMD[cmd]
        if f then
            skynet.ret(skynet.pack(f(...)))
        end
    end)
    -- 初始化逻辑(比如启动监听)
    -- 一般用 skynet.timeout(0, function() ... end) 延迟执行
end)

消息头部的类型(ptype)字段。

  • Skynet 在消息传递时,会在消息头部附加一个类型(ptype)字段。Skynet 设计上将消息类型作为框架级的大类,而"具体干什么"由自定义的命令字段区分。常见的类型有:
  • "lua":Lua 服务之间互相发送的消息(最常用的)
  • "client":来自客户端连接的消息
  • "system":系统内部消息(如退出、错误通知)
  • 自定义数字类型:通过 skynet.register_protocol 定义,比如给id为skynet.PTYPE_CLIENT的数字指定一个name

register_protocol的作用

  • 把一个数字和一个好记的字符串绑定,之后就可以用字符串来表示消息类型。
  • register_protocol 里 id 和 name 的关系就是:
    • id:这个类型的底层数字标识(可以是预定义常量,也可以是自定义数字)
    • name:你给这个数字起的别名,之后用字符串来指代它
  • 例子:
lua 复制代码
// 例子:注册后 Skynet 内部维护了 "client" → 数字 PTYPE_CLIENT 的映射
skynet.register_protocol {
		// 给它起了个叫 "client" 的字符串名字。注册完之后,你就可以用 "client" 来代替数字id。
    name = "client",
    
    // skynet.PTYPE_CLIENT 是 Skynet 已经定义好的一个数字常量,表示"客户端消息"这个类型。
    // 它是预设的几个标准类型之一(像 PTYPE_LUA、PTYPE_SYSTEM 一样)。
    id = skynet.PTYPE_CLIENT,
}

预定义常量

  • 常见的预定义常量还有:(冒号后面对应的是大概的用途)
  • skynet.PTYPE_LUA:Lua 服务间消息(你用的 "lua" 背后就是这个)
  • skynet.PTYPE_CLIENT:来自客户端连接的消息
  • skynet.PTYPE_SYSTEM:系统消息(服务退出通知等)
  • skynet.PTYPE_RESPONSE:内部用于 skynet.call 的回应

自定义数字(类型)

  • 我们都知道Skynet 在消息头部用 1 个字节(0~255)来标记消息类型。所以底层传输时,类型一定是数字。
  • 为了让你写代码方便,Skynet 提供了两个东西:
    • 预定义的常量:比如 skynet.PTYPE_LUA、skynet.PTYPE_CLIENT、skynet.PTYPE_SYSTEM,它们其实都是数字(分别对应 0、3、1 等值,不同版本可能略有差异,但你不需要记数字)。
    • skynet.register_protocol:允许你为某个数字类型起一个人类可读的名字(字符串),并且也可以通过这个名字来引用它。

  • 自定义数字(类型)就是你自己创建一个全新的消息类型编号(在 0~255 之间,不能与系统已有类型冲突)。
  • 假设你想区分"好友私聊消息"和"世界频道消息",可以这样:
lua 复制代码
-- 自己找个没被占用的数字,比如 10 和 11
skynet.register_protocol {
    name = "private_chat",
    id = 10,
}
skynet.register_protocol {
    name = "world_chat",
    id = 11,
}

// 之后用 skynet.send(addr, "private_chat", ...) 发消息。
// 接收方也用 skynet.dispatch("private_chat", func) 来处理。
// "自定义数字(类型)"的含义:你自己为某个整数id类型分配一个名字。
相关推荐
摇滚侠6 分钟前
《SpringBoot 3:入门与应用实战》第 15 章 生产级特性 监控指标 Metrics 阅读笔记
java·spring boot·笔记
噜~噜~噜~39 分钟前
操作系统笔记-1.1.3 操作系统的特征
笔记·操作系统
杨先生哦1 小时前
【2026热端攻防系列 10/12】前端凭据安全深度攻防:Cookie/Storage劫持、会话固定、凭据泄露与浏览器最新加固方案
前端·笔记·安全·web安全
天天爱吃肉82181 小时前
# 商用车多体动力学实战笔记|第7篇:制动系统与制动热衰退、ABS滞环控制
大数据·人工智能·笔记·python·嵌入式硬件·汽车
xiaoyuchidayuma1 小时前
【交流绕组及其磁动势-典型交流绕组结构(绘制绕组展开图)】
笔记·学习
崔高杰2 小时前
【自动阅读笔记】Inference-Time Scaling for Generalist Reward Modeling
人工智能·笔记·机器学习
chenzhou__4 小时前
独立游戏开发日志 ①:从信号博弈到涂色对战——一次玩法重构始
笔记·后端·学习·unity·go·独立游戏
杨先生哦4 小时前
【2026热端攻防系列 11/12】前端AI风控攻防实战:验证码缺陷、人机验证绕过、智能爬虫对抗与企业智能风控加固方案
前端·人工智能·笔记·爬虫·安全
摇滚侠4 小时前
《SpringBoot 3:入门与应用实战》第 15 章 生产级特性 使用监控体系 阅读笔记
spring boot·笔记·后端
我叫唧唧波4 小时前
【Java】Java 基础系统学习笔记
java·笔记·学习