【转】从零开始学习Skynet_examples研究
转自 http://blog.csdn.net/mr_virus/article/details/52330193
一、编译Skynet:
1、用ubuntu15.10直接
make linux
编译Skynet会有报错。安装autoconf、libreadline6、libreadline6-dev后就能编译成功了。
sudo apt-get install autoconf sudo apt-get install libreadline6 libreadline6-dev
二、关于examples相关的代码分析:
1、关于examples/config里面有一行:
start = "main" -- main script
意思是通过start="main"开启第一个Skynet的服务main.lua。这个文件main.lua也在examples文件夹中:
第一行先引用skynet这个库,这个库是用lua写的,即是lualib/skynet.lua。里面定义了这些接口:
1).skynet.start()用于服务的入口,加载lua服务时先运行这里的代码,它调用了luaclib-src/lua_skynet.c里面的callback(),最终调用skynet的框架skynet_callback()来设置毁掉函数。
2).skynet.newservice()用于启动一个lua写的服务,省略掉.lua后缀名。它调用了skynet.call()然后skynet.call()调用luaclib-src/lua_skynet.c里面send(),最终调用skynet的框架skynet_send()压入队列。
3).skynet.call()用于发送一条消息给Skynet的框架。消息会压入队列,等待SKynet框架的调度。
4).skynet.exit()移除服务,通过skynet.send()发送一条消息给skynet框架来移除lua的这个服务。
5).skynet.monitor()用于监视服务,看它是否关闭。
main.lua共打开了四个服务:
1).service_mgr:这个是系统的模块,用于管理服务。
2).console:这个是系统的模块,用于管理输出。
3).simpledb:这个是例子模块,用于管理Key-Value数据。
4).watchdog:这个是例子模块,用于监视socket端口,等待数据。
main.lua没有调用其他函数,加载完服务,它也就完成了任务,所以它最后调用了skynet.exit()把自己杀掉。
现在Skynet已经启动了watchdog服务,监听着8888端口,等待客户端的连接。
下面是watchdog服务的skynet_start()开始函数:
skynet.dispatch()这个服务的回调函数,通过SOCKET[]来调用函数,这些函数有:
SOCKET.open():打开agent服务并启动,使用gate来管理socket。
SOCKET.close():关闭agent服务。
SOCKET.error():打印错误信息。
SOCKET.data():有数据到来。
下面是agent服务代码:
function CMD.start(conf)
local fd = conf.client
local gate = conf.gate
WATCHDOG = conf.watchdog
-- slot 1,2 set at main.lua
host = sprotoloader.load(1):host "package"
send_request = host:attach(sprotoloader.load(2))
skynet.fork(function()
while true do
send_package(send_request "heartbeat")
skynet.sleep(500)
end
end) client_fd = fd
skynet.call(gate,"lua","forward",fd)
end
前面watchdog调用SOCK.open()的时候就调用了这里的CMD.start(),在客户端输出了"Welcome to skynet"。
Agent的核心就是注册了协议,并根据协议把数据发送给simpledb服务去处理。
协议的详细部分看lualib/skynet.lua。
最后看看simpledb服务:
这里很简单地处理了SET和GET。
以上只是大概浏览了一遍Skynet附带的例子,了解了一些Skynet提供的lua接口,其他接口可以查看skynet.lua代码。
最新文章
- CLR via C#深解笔记四 - 方法、参数、属性
- HDFS简介【全面讲解】
- SQL Server复制入门(一)----复制简介【转】
- UI2_UITableViewDelete
- linux - Mysql 创建用户和授权
- js中的apply call 操作小结(参考自网络)
- js中__proto__(内部原型)和prototype(构造器原型)的关系
- 如何在Eclipse中配置Tomcat(免安装版)
- BZOJ_3993_[SDOI2015]星际战争_二分+网络流
- GDB程序调试
- Python(三)——文件操作
- mac上配置使用virtualenv
- javascript DOM 常用方法
- 论如何优雅地拿下PHPCMS
- Four-Operations
- TensorFlow 从零到helloWorld
- Javascript-短路 与(&;&;)
- 标头“Vary:Accept-Encoding”指定方法[转]
- Git分支管理小结
- 一图总结C++中关于指针的那些事
热门文章
- android 下使用Direct Texture
- Maven--archetypeCatalog笔记
- RMAN_PIPE
- 持续集成(CI – Continuous Integration)
- PHP中call user func()和call_user_func_array()调用自定义函数小结
- Django学习笔记5-url
- font(字体)所使用的属性
- Excel2003 去除重复项
- 大数据学习--day02(标识符、变量、数据类型、类型转换、进制转换、原码反码补码)
- 使用 win10 的库来组织自己的同类文件