白话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中的难点是函数.对象和继承,前面已经介绍过函数系列.从本系列开始介绍对象部分,本文是该系列的第一篇——初 ...
随机推荐
- 使用wps插件,实现word转PDF
项目需求:不打算用office自带的组件实现word转pdf操作 环境需求:安装wps2016专业版 新建一个控制台应用程序 添加引用:在COM下 Kingsoft Add-In Designer和U ...
- OpenCV绘制图像中RGB三个通道的直方图
一开始是看<OpenCV计算机视觉编程攻略(第2版)>这本书学做直方图,但是书本里说直方图的部分只详细说了黑白图像(单通道)的直方图绘制方法,RGB图像的直方图只说了如何计算,没有说计算完 ...
- cmake教程
1 教程 cmake界的hello world[2] 进阶的入门教程参考[3] 2 引用 [1] cmake官网 [2] 在 linux 下使用 CMake 构建应用程序 [3] Valgrind官网
- Eclipse导入maven项目时,pom-xml文件报错处理方法
报错如下: Cannot read lifecycle mapping metadata for artifact org.apache.maven.plugins 解决方法: 出现该错误是因为jar ...
- Jupyter-notebook 不自动打开浏览器解决办法
我的系统是Manjaro Linux, 一直以来,我使用jupyter-notebook的办法都是使用命令sudo jupyer-notebook --allow-root,然后手动复制粘贴URLS到 ...
- oracle直接读写ms sqlserver数据库(一)如何下载oracle database gateway for sqlserver
想从Oracle实时同步数据到Ms Sqlserver,需要在Oracle里面直连Sqlserver进行数据的读写,可以在Oracle服务器上安装oracle database gateway for ...
- RHEL5.8安装
创建完成后新的虚拟机.使用光盘启动后,启动界面如下图. 大概介绍下显示界面内容的意思: 1.To install or upgrade in graphical mde, press the ...
- python语法_字符串
字符串 a = 'asdb' #双引号和打印号没区别, 操作 "abc"*2 打印两遍"abc" #字符串 加* 重复打印字符串 “abc”[2:1] #切片 ...
- 源码包安装mysql5.6
含有的命令:wget,tar,cp,groupadd,useradd,chown,service,chkconfig,exportsource,mysql_secure_installation,my ...
- CAD数据导入Arcgis10.1的依赖关系
这段时间在做基于Arcgis10.1API处理AutoCAD图纸数据并将处理后的数据坐标转换为xml文件,以便于在开发的项目中使用.通过这段时间的开发总结以下问题希望能对童鞋有所帮助: 1.遇到CAD ...