白话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中的难点是函数.对象和继承,前面已经介绍过函数系列.从本系列开始介绍对象部分,本文是该系列的第一篇——初 ...
随机推荐
- IdentityServer4 记录
IdentityServer4 文档 https://www.cnblogs.com/edisonchou/p/identityserver4_foundation_and_quickstart_01 ...
- selenium webdriver 如何添加cookie
一. webdriver中常用的cookie方法 webdriver中提供了操作cookie的相关方法: get_cookies() 获得cookie信息 add_c ...
- Wxpython入门
Wxpython入门 api文档以及中文教程: https://pan.baidu.com/s/1TDTgHg9Mwc74ODQy68YnlQ 提取码:354n 入门示例 frame=wx.Frame ...
- css 块元素、内联元素、内联块元素
块元素.内联元素.内联块元素: 元素就是标签,布局中常用的有三种标签,块元素.内联元素.内联块元素,了解这三种元素的特性,才能熟练的进行页面布局. 块元素: 块元素,也可以称为行元素,布局中常用的标签 ...
- css 网格布局简单应用
将属性 display 值设为 grid 或 inline-grid 就创建了一个网格容器,所有容器直接子结点自动成为网格项目. grid :网格项目按行排列,网格项目占用整个容器的宽度. inlin ...
- JavaScript的正则表达式的基础
正则表达式:* 具体字符(字面值)*字符边界*字符集合[ace],[0123456789]*字符补集[^ qxz]: 不在qxz范围内*字符范围[a-z 0-9]*字符簇(系统定义好的常用集合)--- ...
- poj2976 Dropping tests(01分数规划 好题)
https://vjudge.net/problem/POJ-2976 又是一波c++AC,g++WA的题.. 先推导公式:由题意得 Σa[i]/Σb[i]<=x,二分求最大x.化简为Σ(a[i ...
- ArcGIS AddIn 批量设置栅格图层背景色为透明
protected override void OnClick() { // // TODO: Sample code showing how to access button host // Arc ...
- Git&Version Control
Git Git(读音为/gɪt/.)是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理. [1] Git 是 Linus Torvalds 为了帮助管理 Linux 内 ...
- javascript的数组之push()
push()方法讲一个元素或多个元素添加到数组的末尾,并返回新数组的长度length,修改数组自身. var numbers = [1, 2, 3]; numbers.push(4); console ...