![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
skynet
文章平均质量分 85
吓人的猿
专注Linux系统开发,网络编程,服务后台开发
展开
-
skynet框架应用 (一) skynet介绍
1 skynet介绍 Skynet 是一个基于C跟lua的开源服务端并发框架,这个框架是单进程多线程Actor模型。是一个轻量级的为在线游戏服务器打造的框架。我在云风博客的基础上,把重要的知识点加上具体的example来讲解skynet如何去使用。前面的比较啰嗦一些,大家不想了解这些知识的,可以直接跳转到第二章节。 1.1 简介 这个系统是单进程多线程模型。 每...原创 2018-03-03 20:39:35 · 38402 阅读 · 4 评论 -
skynet框架应用 (十八) http协议的服务
18 http协议的服务 http协议的服务分为http服务端与http客户端,skynet服务作为http服务端的时候,可以像其他的web服务器一样,接收http请求并给与应答。skynet的服务作为http客户端的时候,可以通过http协议像远端发送请求并等待得到应答。18.1http服务端 skynet 从 v0.5.0 开始提供了简单的 http 服务器的支持。skynet.httpd...原创 2018-03-04 11:07:56 · 9427 阅读 · 8 评论 -
skynet框架应用 (十七) protobuffer
17 protobuffer 假如我们要建立的skynet服务器与客户端的连接方式为长连接,且选择了Google的Protobuf来定制我们的网络协议,那么,接下来我们要解决的问题就是:如何在skynet框架中使用socket+protobuf。 由于protobuf的lua版本的支持存在着部分缺陷,为了避免踩坑,这里我们直接使用云风博客中推荐的pbc动态proto解析库。17.1 安装PBC...原创 2018-03-04 11:03:59 · 5115 阅读 · 9 评论 -
skynet框架应用 (十六) mysql
16 mysql skynet封装了mysql的驱动,主要文件为 lualib/skynet/db/mysql.lua。先在ubuntu下安装mysqlsudo apt-get install mysql-server设置mysql的用户密码为root 123456,并且创建一个skynet数据库。16.1 连接mysql连接mysql的APIlocal skynet = require "...原创 2018-03-04 11:03:02 · 7002 阅读 · 1 评论 -
skynet框架应用 (十五) msgserver
15 msgserver snax.msgserver 是一个基于消息请求和回应模式的网关服务器模板。它基于 snax.gateserver 定制,可以接收客户端发起的请求数据包,并给出对应的回应。 和 service/gate.lua 不同,用户在使用它的时候,一个用户的业务处理不基于连接。即,它不把连接建立作为用户登陆、不在连接断开时让用户登出。用户必须显式的登出系统,或是业务逻辑设计的超...原创 2018-03-04 11:02:01 · 5512 阅读 · 3 评论 -
skynet框架应用 (十四) 登录服务
14 登录服务 现在的网络游戏大部分是需要登录的,一般会有一个专门的登录服务来处理,登录服务要解决的问题:1、用户登录信息保密工作。2、实际登录点分配工作。14.1 加密算法14.1.1 DHexchange密钥交换算法 DHexchange密钥交换算法主要用来协商一个服务器与客户端的密钥。云风已经帮我们封装好了这个加密方法,可以直接这么使用:package.cpath = "luaclib...原创 2018-03-04 10:58:55 · 12574 阅读 · 1 评论 -
skynet框架应用 (十三) 网关服务
13 网关服务 skynet 提供了一个通用模板 lualib/snax/gateserver.lua 来启动一个网关服务器,通过 TCP 连接和客户端交换数据。 TCP 基于数据流,但一般我们需要以带长度信息的数据包的结构来做数据交换。gateserver 做的就是这个工作,把数据流切割成包的形式转发到可以处理它的地址。local gateserver = require "snax.ga...原创 2018-03-04 10:45:23 · 8810 阅读 · 11 评论 -
skynet框架应用 (十一) 域名查询
11 域名查询 在 skynet 的底层,当使用域名而不是 ip 时,由于调用了系统 api getaddrinfo ,有可能阻塞住整个 socket 线程(不仅仅是阻塞当前服务,而是阻塞整个 skynet 节点的网络消息处理)。虽然大多数情况下,我们并不需要向外主动建立连接。但如果你使用了类似 httpc 这样的模块以域名形式向外请求时,一定要关注这个问题。 skynet 暂时不打算在底层实...原创 2018-03-04 10:33:24 · 2570 阅读 · 0 评论 -
skynet框架应用 (十) socketChannel
10 socketChannel 在与外部服务交互式时,请求回应模式是最常用模式之一。通常的协议设计方式有两种。每个请求包对应一个回应包,由 TCP 协议保证时序。发起每个请求时带一个唯一 session 标识,在发送回应时,带上这个标识。这样设计可以不要求每个请求都一定要有回应,且不必遵循先提出的请求先回应的时序。 对于第一种模式,用 skynet 的 Socket API 很容...原创 2018-03-04 10:32:10 · 4737 阅读 · 0 评论 -
skynet框架应用 (九) socket网络服务
9 socket网络服务9.1 skynet.socket 常用api--这样就可以在你的服务中引入这组 api 。local socket = require "skynet.socket"--建立一个 TCP 连接。返回一个数字 id 。socket.open(address, port) --关闭一个连接,这个 API 有可能阻塞住执行流。因为如果有其它 corou...原创 2018-03-04 10:28:22 · 10349 阅读 · 4 评论 -
skynet框架应用 (八) Multicast组播
8 Multicast组播8.1 Multicast介绍local mc = require "skynet.multicast" 引入 multicast 模块后,你可以使用 skynet 的组播方案。你可以自由创建一个频道,并可以向其中投递任意消息。频道的订阅者可以收到投递的消息。 你可以通过 new 函数来创建一个频道对象。你可以创建一个新频道,也可以利用已知的频道 id 绑定一个已有频...原创 2018-03-03 21:01:37 · 4679 阅读 · 7 评论 -
skynet框架应用 (七) 本地服务间消息通信
7 服务间消息通信 skynet中的每一个服务都有一个独立的lua虚拟机,逻辑上服务之间是相互隔离的,那么你就不能使用传统意义上的LUA全局变量来进行服务间通信了。 在skynet中服务之间可以通过skynet消息调度机制来完成通信。skynet中的服务是基于actor模型设计出来的,每个服务都可以接收消息,处理消息,发送应答消息。 每条 skynet 消息由 6 部分构成:消息类型、ses...原创 2018-03-03 20:59:19 · 12088 阅读 · 14 评论 -
skynet框架应用 (六) 服务调度
6 服务调度local skynet = require "skynet"--让当前的任务等待 time * 0.01s 。skynet.sleep(time) --启动一个新的任务去执行函数 func , 其实就是开了一个协程,函数调用完成将返回线程句柄--虽然你也可以使用原生的coroutine.create来创建协程,但是会打乱skynet的工作流程skynet.for...原创 2018-03-03 20:54:09 · 9111 阅读 · 8 评论 -
skynet框架应用 (五) 服务别名
5 服务别名 每个服务启动之后,都有一个整形数来表示id,也可以使用字符串id来表示,例如::01000010,其实就是把id:0x01000010转换成字符串。 但是这个数字的表示方式会根据服务的启动先后顺序而变化,不是一个固定的值。如果想要方便的获取某个服务,那么可以通过给服务设置别名来。 5.1 本地别名与全局别名 在skynet中,服务别名可以分为两种:一种是本地别名,本地别名只能...原创 2018-03-03 20:52:16 · 5935 阅读 · 5 评论 -
skynet框架应用 (四) 服务类型
4 服务类型 skynet中的服务分为普通服务与全局唯一服务。第3节启动方式就是一个普通服务,而全局唯一服务顾名思义就是在skynet中只能生成一个服务实例。4.1 普通服务 每调用一次创建接口就会创建出一个对应的服务实例,可以同时创建成千上万个,用唯一的id来区分每个服务实例。使用的创建接口是:--[[1. 用于启动一个新的 Lua 服务,luaServerName是脚本的名字(不用写 ...原创 2018-03-03 20:50:05 · 8700 阅读 · 0 评论 -
skynet框架应用 (三) 构建服务的基础API
3 构建服务的基础APIlocal skynet = require "skynet" --conf配置信息已经写入到注册表中,通过该函数获取注册表的变量值skynet.getenv(varName) 。--设置注册表信息,varValue一般是number或string,但是不能设置已经存在的varnameskynet.setenv(varName, varValue) -...原创 2018-03-03 20:47:06 · 12196 阅读 · 3 评论 -
skynet框架应用 (二) 搭建skynet
2 在ubuntu上搭建skynet2.1 获取skynet源代码安装git代码管理工具 $ sudo apt-get update $ sudo apt-get install git 注意:如果安装失败,请先安装一下只支持库 $ sudo apt-get install build-essential libssl-dev libcurl4-gnutls-dev libexpat1-...原创 2018-03-03 20:42:02 · 11637 阅读 · 6 评论 -
skynet框架应用 (十二) snax框架
12 snax框架 snax 是一个方便 skynet 服务实现的简单框架。(简单是相对于 skynet 的 api 而言) 使用 snax 服务先要在 Config 中配置 snax 用于路径查找。每个 snax 服务都有一个用于启动服务的名字,推荐按 lua 的模块命名规则,但目前不推荐在服务名中包含"点" (在路径搜索上尚未支持 . 与 / 的替换)。在启动服务时会按查找路径搜索对应的文...原创 2018-03-04 11:11:17 · 5730 阅读 · 12 评论