白话skynet第一篇
当你走过一个坐在自己店门前的杂货商面前。走过一个吸着烟斗的守门人面前,走过一个马车夫面前时,请你给我描绘一下这个杂货商、守门人和马车夫,他们的姿态,他们的外貌,要用画家那样的细节描绘出他们的精神本质,使我不至于把他们同任何别的杂货商人、任何别的守门人、任何别的马车夫混同起来,还请你只用一句话就让我知道马车夫有一匹马同其他的马是不一样的。 ——福楼拜指导莫泊桑
从今天开始,我给自己设定了几个小目标,其中之一是:每天都写上几千字或者半个小时。今天是开始码字的第一天,坐在电脑前想了好一会,从写什么开始?目的是什么?写什么不重要,目的是培养一下码字的习惯。我的本职是码代码的。就从我了解的东西开始写吧。今天姑且为大家介绍下:Skynet。
Skynet
Skynet是一个轻量级的游戏服务器框架。语言是C+LUA。挺干净的。作者是云风。社区也一直在维护。他想做的核心的一件事情就是,提供一个消息转发机制,用C+LUA实现一个actor模式的服务器。actor模式和消息转发机制的关系是这样的,actor模式是一种设计模式,在此之前实体是通过多线程的锁等机制实现读写数据,使用actor之后,各个实体之间的沟通改为消息传递。实体本身管理自己的行为和动作。不熟悉的可能不太理解。
下面介绍下Skynet的使用。
首先Git clone源码之后,在Linux环境下编译出Skynet。
其次,他的启动方式,不是用lua编译代码跑起来,而是用编译出的Skynet带一个配置文件跑一个文件。这是一个新人觉得怪异的地方。
再说代码的编写。如上所述,这里的实体就是一个一个的服务。服务之间通过Skynet框架的消息传递。所以我们的核心任何有2个:
1.如何启动一个服务。
启动服务。
require "skyenet"
skynet.start(function()
....
skynet.newservice("服务名")
end
)
这样算是启动了一个服务。
newservice填的服务名,他是会在config中找到对应的服务的文件,继续运行起来。
2.服务之间如何沟通。这个也是重点
2.1 首先服务需要想Skynet框架注册本服务。注册需要给什么呢?假设是你自己设计你会怎么做?每个服务需要有一个名字吧?
所以
1. 名字。作为标识。
2. 地址(相当于邮件地址,别人给你发消息的接收地址)
3. 接收消息的语种/类型(想象一下,别人寄给你一封信,可惜你都不知道这个是什么语言写的?中文英文你知道,你分得清楚,越南文和泰文吗?我们需要提前说清楚免得别人写信的内容写
4. 消息处理
错。)
1. 解码decode。别人的语言咱们不一定会使。咱得翻译一下。
2. 编码encode。
3. 来源。source。
分析处理socket的agent中的服务
1. 名字 , local watchdog = skynet.newservice("服务名") 这个服务名就是标识的名字
2. 地址 , watchdog 就是地址一个int
为什么名字和地址会在外面呢。这个也可以理解。名字和地址那是对外的。是别人用来区分和标识你的。你的名字和你家的地址当然是别人(你爸和村长)取的。
skynet.register (
name = "client" --类型名。 指示这个是客户端消息
id = skynet.PTYPE_TEXT -- 指示skynet 数据的类型。
unpack = ... -- 解码
pack = ... -- 编码方式
dispath = function (type,func)
)
... 就是
dispath 分发函数,为消息类型 type ,指定一个函数处理。
,function ( session , source , cmd ,...) -- 内部转发,session, 来源,指令 和 其他参数
end
说到这里。我们得提到通过发消息给一个服务,调用一个服务的服务了。
skynet.call ( address, type, cmd,... )
就是说,告诉address地址的服务,有一个type类型的消息,内部约定一般服务指定服务里面哪个函数(cmd),至于参数就在...里面自动填充了
然后我们看看服务内部收到了什么,session , source , cmd ,...
这里的session是指内部的一个session返回的时候调用者知道。
source是来源。
至于怎么返回,skynet.ret(skynet.pack(...))
明天继续分解这块:D
才一千三百字。
白话skynet第一篇的更多相关文章
- 白话skynet第二篇:skynet的通信调试pack和sprotol
今天来说说Skynet客户端和服务端网络通信的基础部分. Skynet当前版本.lua是skynet自带的5.3版本. 根据示例,我们可以知道.通信的步骤如下. 客户端按大小端打包成二进制. sock ...
- 从0开始搭建SQL Server AlwaysOn 第一篇(配置域控)
从0开始搭建SQL Server AlwaysOn 第一篇(配置域控) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www.cnb ...
- Python爬虫小白入门(四)PhatomJS+Selenium第一篇
一.前言 在上一篇博文中,我们的爬虫面临着一个问题,在爬取Unsplash网站的时候,由于网站是下拉刷新,并没有分页.所以不能够通过页码获取页面的url来分别发送网络请求.我也尝试了其他方式,比如下拉 ...
- Three.js 第一篇:绘制一个静态的3D球体
第一篇就画一个球体吧 首先我们知道Three.js其实是一个3D的JS引擎,其中的强大之处就在于这个JS框架并不是依托于JQUERY来写的.那么,我们在写这一篇绘制3D球体的文章的时候,应该注意哪些地 ...
- 深入学习jQuery选择器系列第一篇——基础选择器和层级选择器
× 目录 [1]id选择器 [2]元素选择器 [3]类选择器[4]通配选择器[5]群组选择器[6]后代选择器[7]兄弟选择器 前面的话 选择器是jQuery的根基,在jQuery中,对事件处理.遍历D ...
- 【第一篇】ASP.NET MVC快速入门之数据库操作(MVC5+EF6)
目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...
- Android基础学习第一篇—Project目录结构
写在前面的话: 1. 最近在自学Android,也是边看书边写一些Demo,由于知识点越来越多,脑子越来越记不清楚,所以打算写成读书笔记,供以后查看,也算是把自己学到所理解的东西写出来,献丑,如有不对 ...
- 深入理解ajax系列第一篇——XHR对象
× 目录 [1]创建对象 [2]发送请求 [3]接收响应[4]异步处理[5]实例演示 前面的话 ajax是asynchronous javascript and XML的简写,中文翻译是异步的java ...
- 深入理解javascript对象系列第一篇——初识对象
× 目录 [1]定义 [2]创建 [3]组成[4]引用[5]方法 前面的话 javascript中的难点是函数.对象和继承,前面已经介绍过函数系列.从本系列开始介绍对象部分,本文是该系列的第一篇——初 ...
随机推荐
- pandas设置值-【老鱼学pandas】
本节主要讲述如何根据上篇博客中选择出相应的数据之后,对其中的数据进行修改. 对某个值进行修改 例如,我们想对数据集中第2行第2列的数据进行修改: import pandas as pd import ...
- Windows上为Apache配置HTTPS
Windows上为Apache配置HTTPS 转 https://www.cnblogs.com/tianzijiaozi/p/7582671.html 1. 安装OpenSSL: Windo ...
- Aspnet Mvc 前后端分离项目手记(一) 关于跨域问题(还有前言)
前言,最近的项目使用前后端分离的模式,记录其中一些知识点.经过这个项目,也对前后端分离有了更多理解,尤其是在技术之外的方面. 越来越多的项目采用前后端分离的原因,有两点: 1,技术方面的原因 ...
- 编程菜鸟的日记-初学尝试编程-C++ Primer Plus 第6章编程练习1
#include <iostream>#include <cctype>using namespace std;int main(){ char ch; while((ch=c ...
- 查看Linux系统软硬件信息
查看Linux系统软硬件信息 查看计算机CPU信息 cat /proc/cpuinfo 查看文件系统信息 cat /proc/filesystems 查看主机中断信息 cat /proc/interr ...
- Java RE (正则表达式)
正则表达式,又称规则表达式.(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.正则表达式通常被用来检索.替换那些符合某个模式(规则) ...
- __x__(15)0906第三天__超链接
HTML5 中的新属性. 属性 值 描述 charset char_encoding HTML5 中不支持.规定被链接文档的字符集. coords coordinates HTML5 中不支持.规定链 ...
- 总结:极光推送java服务端(1)
遇到的问题: 1.怎么用极光推送 2.极光推送发送失败报错 返回{ } 3.透传和推送区别以及怎么设置 我的解决方案: 问题1.极光推送类里面有不同的方法,需要发给那些人就调用相应的方法.有安卓.io ...
- 白盒测试实践-day02
一.任务进展情况 小组分工完成后,了解findbugs的使用过程,以及junit的测试步骤. 二.存在的问题 由于对单元测试不是太了解,导致无法进行测试. 三.解决方法 看mooc上面的视频,了解测试 ...
- IntelliJ IDEA 2017.2.6 x64 配置 tomcat 启动 maven 项目
IntelliJ IDEA 2017.2.6 x64 配置 tomcat 启动 maven 项目 1.确认 IDEA 是否启用了 tomcat 插件 2.添加 tomcat 选择 tomcat 存放路 ...