skynet
傲然君
这个作者很懒,什么都没留下…
展开
-
skynet master/slave 测试
master / slave 配置文件均沿用前一篇文章:skynet master/slave 模式。一、测试脚本main.lua:根据配置文件判断当前节点是否为 master,并对指定地址进行监听。local skynet = require "skynet"local socket = require "skynet.socket"local cluster = require ...原创 2020-05-05 14:23:38 · 733 阅读 · 1 评论 -
skynet master/slave 模式
一、相关配置项 harbor节点唯一性编号,1~255 之间的任意整数,因此一个 skynet 网络最多支持 255 个节点。若某个 slave 意外退出,则对应的 harbor 会被废弃,不可再使用(即使该 slave 后续重启),这样是为了防止网络中其它服务还持有这个断开的 slave 上的服务地址,而一个新的进程以相同的 harbor 接入时,是无法保证旧地址和新地址不重复的。也就...原创 2020-05-04 19:58:02 · 1318 阅读 · 0 评论 -
skynet:queue
在 skynet 中,当服务收到消息后,skynet 会起一个协程来处理消息,当某个协程涉及到异步让出执行时,skynet 会继续执行下一条消息,等到该协程的醒消息到达时便继续执行。有时候,我们想保持处理客户端发送消息的顺序性,比如客户端依次发送消息 a 和 b ,而由于某种需求,我们又要保证 b 一定要在 a 之后返回,这个时候就需要用到 skynet.queue。使用方法:local q...原创 2020-04-30 15:05:20 · 1746 阅读 · 1 评论 -
skynet:skynet.call() 失败
skynet.call() 是一个阻塞函数,服务使用 skynet.call 发出请求后会等待应答,此时: 若响应服务退出(调用skynet.exit),会自动给未答复的请求发送一个 error 消息,告诉它可以从 skynet.call 阻塞返回了,请求的服务会直接报一个错误; 若响应服务正常,但并未返回响应,则 skynet.call 阻塞会返回,同时请求的服务会收到一个告警信息:...原创 2020-04-29 09:03:59 · 1026 阅读 · 0 评论 -
skynet:skynet.response
在前面的文章:skynet:session 中,已经使用过 skynet.ret / skynet.retpack 对消息进行应答。但这两个函数有一个使用限制,即:消息接收与消息应答必须在同一个协程里完成,也就是说:请求被哪一个协程接收,就必须在这个协程响应。这是因为在 skynet 中,当一个服务收到一个消息的时候,会启动一个协程来处理,并把协程句柄与发送消息的服务地址进行一一对应记录在 ta...原创 2020-04-29 08:26:52 · 1030 阅读 · 0 评论 -
skynet:session
当一个服务使用多个协程发送消息时,可能出现多个协程都在等待响应。那么当某个响应到达时,应该唤醒哪个协程,可通过 session 来判断,这是因为在 skynet 中,session 能保证消息在本服务中的唯一性,从而使消息与响应一一对应起来。但 session 只有在使用 skynet.call 或 skynet.rawcall 发送消息时才有意义。一、测试脚本echoluamsg.lua...原创 2020-04-28 15:51:44 · 872 阅读 · 0 评论 -
skynet:udp
skynet 为 udp 协议做了有限的支持。和 tcp 协议不同,udp 协议不需要阻塞读取。这是因为 udp 是不可靠协议,无法预期下一个读到的数据包是什么(协议允许乱序和丢包),因此 skynet 的 udp 协议封装采用的是 callback 的方式。一、服务端测试main.lualocal skynet = require "skynet"local socket = requ...原创 2020-04-28 12:30:40 · 903 阅读 · 0 评论 -
skynet:TCP主动连接端
前面的文章讲过,如何使用 socket 建立 tcp 监听:#监听指定地址:ip:portsocket_id = socket.listen("ip:port")#当监听到连接时,自定义函数:accept 会被触发socket.start(socket_id, accept)function accept(socket_id, addr) skynet.error(addr ...原创 2020-04-27 20:58:19 · 883 阅读 · 0 评论 -
skynet:自带网关服务
一、main() 启动 watchdogexamples/main.lua,会首先启动一个 watchdog: local watchdog = skynet.newservice("watchdog") skynet.call(watchdog, "lua", "start", { port = 8888, maxclient = max_client, nodelay = t...原创 2020-04-25 12:51:42 · 598 阅读 · 0 评论 -
skynet:agent
gateserver 用于管理网络连接,也可以读取网络数据,但它并没有提供发送网络数据相关的写功能,而涉及请求处理与响应一般交给 agent 服务(agent 服务可以由一个普通服务来充当)。一、agent 服务myagent.lualocal skynet = require "skynet"local netpack = require "skynet.netpack"local s...原创 2020-04-24 19:58:37 · 931 阅读 · 0 评论 -
skynet:网关服务 二
一、控制客户端连接数在启动网关时,可指定当前服务的最大连接数,以避免大量用户登录到该服务。启动网关服务后,运行三个 socketclient 客户端,结果如下:可以看到,第三个客户端连接成功后,被立即关闭。二、gateserver 其他回调函数--[[ gateserver监听成功后,会调用此接口,可用来进行一些初始化操作。 source:请求来源地址,conf:开启 gates...原创 2020-04-24 12:03:34 · 1064 阅读 · 0 评论 -
skynet:网关服务与封包/解包
TCP 是基于数据流的,但一般需要以带长度信息的数据包来做数据交换,skynet 提供了一个通用模板 lualib/snax/gateserver.lua 来启动一个网关服务器,gateserver 做的就是这个工作。一、编写网关服务mygateserver.lualocal skynet = require "skynet"local gateserver = require "snax...原创 2020-04-23 18:47:44 · 2135 阅读 · 0 评论 -
skynet:httpserver 研究
skynet.newservice(name),用于创建新服务,会调用服务初始化函数:skynet.start(); skynet.call(“服务名”,“lua”,“方法名(函数名)”,参数1、参数2…):向指定服务发送lua类型消息,阻塞函数; skynet.register_protocol{}:将指定的协议记录到一张表里面,后续可通过协议名或id找到此协议。相关属性:...原创 2020-04-20 19:51:41 · 540 阅读 · 0 评论 -
skynet:调用c模块
一、定义 c 模块#include <lua.h>#include <lauxlib.h>static int add(lua_State *L) { float a1 = lua_tonumber(L, 1); float a2 = lua_tonumber(L, 2); lua_pushnumber(L, a1 + a2); re...原创 2020-04-19 10:24:23 · 431 阅读 · 0 评论 -
skynet:服务间发送消息
skynet 是单进程多线程框架,每个 lua service 独立运行在自己的 lua vm 里,而本篇文章要实现的是让一个 service 发送消息,另一个 service 处理消息。一、skynet 启动新 servicelocal skynet = require "skynet"skynet.start(function() skynet.newservice("myservi...原创 2020-04-17 14:17:48 · 1000 阅读 · 0 评论 -
skynet:服务间相互调用与转交socket控制权
socket.abandon(id):用于清除 socket id 在本服务内的数据结构,但并不关闭这个 socket ,可用于向其他服务转交socket控制权。目录结构与文章:skynet:socket 测试 保持一致,区别在于修改文件:service_gate.lua,并在 service 目录下新增文件:agent1.lua。一、service_gate.lualocal skynet...原创 2020-04-17 13:25:46 · 436 阅读 · 0 评论 -
skynet:服务的别名
skynet 由服务组成,并可使用字符串对服务进行命名,但服务的名字不可重复。相关函数: newservice(name, …):启动一个名为 name 的新服务(这就是风云提到的沙盒,即各服务独立运行,互不影响,但服务之间可相互调用); uniqueservice(name, …):启动一个唯一服务,若该服务已启动,则返回已启动的服务地址; queryservice(name):查询一个...原创 2020-04-17 10:51:52 · 577 阅读 · 0 评论 -
skynet:分离项目代码与 skynet 源码
在前面的文章:skynet 测试 中,自己的代码与 skynet 源码混合在一起,由于我们不是对 skynet 进行二次开发,所以最好将两者分离开来。一、自定义项目目录在 /root 下新建文件夹:server_01,server_01 结构如下: service:存放服务脚本(本文测试依然采用前一篇文章的 socket 测试脚本); config :存放配置文件; log:存放日志...原创 2020-04-15 20:05:08 · 271 阅读 · 0 评论 -
skynet:socket 测试
一、demo1、目录准备 新建 server 目录,将 skynet 目录拷贝到 server 目录下; 在 skynet 目录同级新建 game 目录; 在 game 目录中新建3个文件,config、main.lua 和 service_gate.lua,其中 log 目录是存放日志文件,最终目录结构如下:2、文件 service_gate.lua 内容local skyne...原创 2020-04-14 12:49:15 · 769 阅读 · 0 评论 -
skynet 编译问题集锦
下载 skynet 源码:https://github.com/cloudwu/skynetskynet 编译很简单,直接切换到 skynet 目录后,执行命令:make linux问题一:git 命令不存在解决方法:https://packages.debian.org/stretch/git问题一:fatal: Not a git repository (or any of t...原创 2020-04-14 10:40:36 · 1712 阅读 · 0 评论 -
skynet worker 线程
一、创建若干 worker 线程skynet 启动时,会创建若干 worker 线程(由配置指定)并指定线程权重:static voidstart(int thread) { pthread_t pid[thread+3]; struct monitor *m = skynet_malloc(sizeof(*m)); memset(m, 0, sizeof(*m)); m->...原创 2020-04-13 15:38:39 · 664 阅读 · 0 评论