转自 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代码。

【转】从零开始学习Skynet_examples研究的更多相关文章

  1. 从零开始学习jQuery(转)

    本系列文章导航 从零开始学习jQuery (一) 开天辟地入门篇 从零开始学习jQuery (二) 万能的选择器 从零开始学习jQuery (三) 管理jQuery包装集 从零开始学习jQuery ( ...

  2. 从零开始学习jQuery (一) 开天辟地入门篇

    一.摘要 本系列文章将带您进入jQuery的精彩世界, 其中有很多作者具体的使用经验和解决方案,  即使你会使用jQuery也能在阅读中发现些许秘籍. 本篇文章是入门第一篇, 主要是简单介绍jQuer ...

  3. ASP.NET从零开始学习EF的增删改查

           ASP.NET从零开始学习EF的增删改查           最近辞职了,但是离真正的离职还有一段时间,趁着这段空档期,总想着写些东西,想来想去,也不是很明确到底想写个啥,但是闲着也是够 ...

  4. 从零开始学习jQuery (五) 事件与事件对象

    本系列文章导航 从零开始学习jQuery (五) 事件与事件对象 一.摘要 事件是脚本编程的灵魂. 所以本章内容也是jQuery学习的重点. 本文将对jQuery中的事件处理以及事件对象进行详细的讲解 ...

  5. 从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式

    本系列文章导航 从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式 一.摘要 本篇文章讲解如何使用jQuery获取和操作元素的属性和CSS样式. 其中DOM属性和元素属性的区分值得 ...

  6. 从零开始学习jQuery (三) 管理jQuery包装集

    本系列文章导航 从零开始学习jQuery (三) 管理jQuery包装集 一.摘要 在使用jQuery选择器获取到jQuery包装集后, 我们需要对其进行操作. 本章首先讲解如何动态的创建元素, 接着 ...

  7. 学习和研究下unity3d的四元数 Quaternion

    学习和研究下unity3d的四元数 Quaternion 今天准备学习和研究下unity3d的四元数 Quaternion 四元数在电脑图形学中用于表示物体的旋转,在unity中由x,y,z,w 表示 ...

  8. 从零开始学习jQuery (二) 万能的选择器

    本系列文章导航 从零开始学习jQuery (二) 万能的选择器 一.摘要 本章讲解jQuery最重要的选择器部分的知识. 有了jQuery的选择器我们几乎可以获取页面上任意的一个或一组对象, 可以明显 ...

  9. 从零开始学习jQuery (一) 入门篇

    本系列文章导航 从零开始学习jQuery (一) 入门篇 一.摘要 本系列文章将带您进入jQuery的精彩世界, 其中有很多作者具体的使用经验和解决方案,  即使你会使用jQuery也能在阅读中发现些 ...

随机推荐

  1. 在Mac终端中使用vim编辑文件步骤

    VIM (Unix及类Unix系统文本编辑器) Vim是一个类似于Vi的著名的功能强大.高度可定制的文本编辑器,在Vi的基础上改进和增加了很多特性.VIM是纯粹的自由软件. http://jingya ...

  2. Knowledge Point 20180303 我们为什么要配置环境变量

    1.1为什么要配置环境变量 在学习JAVA的过程中,涉及到多个环境变量(environment variable)的概念,如PATH.正确地配置这些环境变量,是能够顺利学习.开发的前提.而经常出现的问 ...

  3. 1.Redis介绍以及安装

    Redis介绍 Redis是一个开源的(BSD开源协议),内存数据结构存储,被用于作为数据库,缓存和消息代理. Redis支持如下数据结构: string(字符串) hashes(哈希) lists ...

  4. Struts2知识点小结汇总

    Struts2部分 1. JavaEE软件三层结构和MVC的区别? JavaEE软件三层机构是由sun公司提供JavaEE开发规范的:Web层(表现层).业务逻辑层.数据持久层.[其中WEB层会使用前 ...

  5. 『ACM C++』 PTA 天梯赛练习集L1 | 034-035

    在一个团队里,一群人一起为一件事情努力奋斗的过程,真的很值得享受,真希望我能拥有很多这样的团队. ------------------------------------------------L1- ...

  6. Redis Sentinel 介绍

    Redis Sentinel   sentinel的功能: 监控:sentinel节点定期检测redis数据节点,其余sentinel节点是否可达. 通知:sentinel 节点会将故障转移结果通知给 ...

  7. 分布式网上商城项目- BeanDefinitionStoreException

    BeanDefinitionStoreException: 严重: StandardWrapper.Throwable org.springframework.beans.factory.BeanDe ...

  8. JS通用弹窗,确定,取消可以回调方法。

    <html> <head> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/j ...

  9. rails应用无法读取kafka数据报错Kafka::Error: Failed to find group coordinator

    如果确保kafka中有数据,rails应用中却无法读取到,或报如下错误: Kafka::Error: Failed to find group coordinator   一般有两种情况,解决:   ...

  10. 使用idea上传项目到gitHub

    上传项目到gitHub 创建好后开始提交本地项目代码如图: 选中VCS选中图中的按钮如图所示: 然后再选中Src点中add按钮如图所示: 然后点中commit Directory后 打开终端进行项目根 ...