hello-skynet之一:hello-world

最近在研究服务端相关技术,不经意间又看到了云风的skynet。这个项目够简洁、够强大、够实用!只可惜文档和入门实例少了些。于是乎准备结合学习过程,来个学习连载,并在github上建立了相关项目:hello-skynet

先看看skynet是什么(不要跟其他同名项目混淆了哦):

… 这是一个轻量级的为在线游戏服务器打造的框架。但从社区 Community 的反馈结果看,它也不仅仅使用在游戏服务器领域 …

好吧,秉承Coder大叔的习性,先来个hello-world! 功能如下:

打印“hello, world!”,并退出

具体步骤如下:

1、新建git库,将skynet作为子模块放到根目录下的skynet文件

2、进入skynet目录,编译skynet,参考Build

3、新建hello-world目录,并添加 config.lua 和 hello-world.lua 两个文件,内容如下:

config.lua

----------------------------------
-- 局部变量
----------------------------------
local _root = "./"
local _skynet = _root.."skynet/"
----------------------------------
-- 自定义参数
----------------------------------
app_name = "hello-world"
app_root = _root..app_name.."/"
----------------------------------
-- skynet用到的六个参数
----------------------------------
--[[
config.thread = optint("thread",8);
config.module_path = optstring("cpath","./cservice/?.so");
config.harbor = optint("harbor", 1);
config.bootstrap = optstring("bootstrap","snlua bootstrap");
config.daemon = optstring("daemon", NULL);
config.logger = optstring("logger", NULL);
--]]
-- 工作线程数
thread = 2
-- 服务模块路径(.so)
cpath = _skynet.."cservice/?.so"
-- 港湾ID,用于分布式系统,0表示没有分布
harbor = 0
-- 后台运行用到的 pid 文件
daemon = nil
-- 日志文件
logger = nil
-- 初始启动的模块
bootstrap = "snlua hello-world"
----------------------------------
-- snlua用到的参数
----------------------------------
lua_path = _skynet.."lualib/?.lua;"..app_root.."/?.lua"
lua_cpath = _skynet.."luaclib/?.so;"..app_root.."/?.so"
lualoader = "skynet/lualib/loader.lua"
luaservice = _skynet.."service/?.lua;"..app_root.."/?.lua"
-- 采用snlua bootstrap启动hello-world模块
--[[
bootstrap = "snlua bootstrap"
start = "hello-world"
--]]

hello-world.lua

local skynet    = require "skynet"
local skymgr    = require "skynet.manager"
local core      = require "skynet.core"
--方式1
--[[
skynet.start(function()
    --  send message to logger
    skynet.error("hello, world!")
    --  dalay and quit
    skynet.timeout(1, skymgr.abort)
end)
--]]
--方式2
--[-[
skynet.start(function()
    -- get the logger service
    local logger    = skynet.localname(".logger")
    if not logger then
        skynet.error("no logger found")
        skymgr.abort()
    end
    core.send(logger, skynet.PTYPE_TEXT, 0, "hello, world!")
    --  delay quit for the logger display
    skynet.timeout(1, function()
        skymgr.abort()
        --skynet.exit()
    end)
end)
--]]

4、测试

进入git库根目录,敲入代码测试:

bashstudy-skynet simple$ skynet/skynet hello-world/config.lua

如果一切正常的话,屏幕上将会出现类似下面的文字

study-skynet simple$ skynet/skynet hello-world/config.lua
[:00000001] LAUNCH logger
[:00000002] LAUNCH snlua hello-world
[:00000002] hello, world!
study-skynet simple$

5、内容说明

*   输出错误信息:           skynet.error(...)
*   获取本地服务句柄方式:    skynet.localname(...)
*   设置定时器方式:         skynet.timeout(...)
*   skynet强制退出方式:     skyname.abort()
*   服务开始方式:           skynet.start(...)
*   服务注销方式:           skynet.exit()
*   发送原始文本消息方式:    skynet.core.send(...)

6、思考

这里的采用的是直接 snlua hello-world 方式,即hello-world.lua作为第一个启用的服务。你可以尝试换成缺省的 snlua bootstrap 方式,观察下输出有什么不同,为什么?

备注:取消 config.lua 最后一段的注释。

Written on May 11, 2015