skynet外界通讯简介:

有两种
①是游戏客互端使用 TCP 连接接入 skynet 节点。如果你用 skynet 实现一个 web 服务器的话,游戏客户端就可以等价于一个浏览器请求。

称为:gate 服务
特征:监听一个 TCP 端口,接受连入的 TCP 连接,并把连接上获得的数据转发到 skynet 内部。
介绍:Gate 可以用来消除外部数据包和 skynet 内部消息包的不一致性。外部 TCP 流的分包问题,是 Gate实现上的约定。Gate 会接受外部连接,并把连接相关信息转发给另一个服务去处理。它自己不做数据处理是因为我们需要保持 gate实现的简洁高效。
外部信息:
①连接本身的接入和断开消息(控制信息包),
②连接上的数据包
gate三种工作模式:
①watchdog 模式 ,由gate 加上包头,同时处理控制信息和数据信息的所有数据;
②agent 模式 ,让每个 agent 处理独立连接;
③broker模式 ,由一个 broker 服务处理不同连接上的所有数据包。
①一开始,Gate无条件转发这两类消息到同一个处理服务。但对于连接数据包,添加一个包头无疑有性能上的开销。
②所以 Gate 还接收另一种工作模式:把每个不同连接上的数据包转发给不同的独立服务上。每个独立服务处理单一连接上的数据包。
③或者,我们也可以选择把不同连接上的数据包从控制信息包(建立/断开连接)中分离开,但不区分不同连接而转发给同一数据处理服务(对数据来源不敏感,只对数据内容敏感的场合)。
 
无论是哪种模式,控制信息都是交给 watchdog 去处理的,而数据包如果不发给 watchdog 而是发送给 agent 或 broker 的话,则不会有额外的数据头(也减少了数据拷贝)。识别这些包是从外部发送进来的方法是检查消息包的类型是否为 PTYPE_CLIENT。当然,你也可以自己定制消息类型让 gate 通知你。
注意:Gate只负责读取外部数据,但不负责回写。也就是说,向这些连接发送数据不是它的职责范畴。

②是第三方的服务,比如数据库服务,它接受一个或多个 TCP 连接。你需要从 skynet 内部建立一个 TCP 连接出去使用。

skynet网关服务简介

网关服务 (GateSever) 是游戏的接入层, 基本功能是管理客户端的连接, 分割完整的数据包, 转发给逻辑处理服务.
       skynet 提供了一个通用模板 lualib/snax/gateserver.lua. 同时基于 gateserver.lua, 实现了一个网关服务 gate.lua.
       TCP 是面向字节流的协议,我们需要把字节流流切割成数据包, 具体的方式见分包.

skynet网络服务器一般是用 gate / watchdog / agent 三剑客
为什么有了socket还要用这个?这一点还没完全搞明白,留作以后解决。

其中 watchdog.lua在文件夹 skynet/examples 下 gate.lua 在 skynet/service 文件夹下,gateserver.lua 在 skynet/lualib/snax 文件夹下。

我们写网关服务的时候,gate直接用example里面的,因为它已经被标准化了。
watchdog也直接用,不用修改。
只有agent服务需要自己写。

gate、watchdog、agent协作方式

首先一个连接进来,先到gate,gate会给watchdog发一个请求。watchdog就会启动一个agent。agent启动以后会给gate发个请求forward,gate就会给连接加上agent属性。当这个连接再有数据进来的时候,还是经过gate,但是gate检查到这个连接已经有agent属性以后,数据就直接发给agent了,不会再发给watchdog。


简化图

从gate基础说起

skynet 提供了一个通用模板 lualib/snax/gateserver.lua 来启动一个网关服务器,通过 TCP 连接和客户端交换数据。 ​
        TCP 基于数据流,但一般我们需要以带长度信息的数据包的结构来做数据交换。gateserver做的就是这个工作,把数据流切割成包的形式转发到可以处理它的地址。

gate服务基础

local gateserver = require "snax.gateserver"
local handler = {}        --必须提供一张表,表里面定义connect、message等相关回调函数
​
-- 注册各种handler函数接口,比如:handler.connect、handler.disconnect、handler.message...
​
gateserver.start(handler)  --网关服务的入口函数

gate服务实例

local skynet = require "skynet"
local gateserver = require "snax.gateserver"
​
local handler = {}
​
--当一个客户端链接进来,gateserver自动处理链接,并且调用该函数,必须要有
function handler.connect(fd, ipaddr)   skynet.error("ipaddr:",ipaddr,"fd:",fd,"connect")gateserver.openclient(fd) --链接成功不代表马上可以读到数据,需要打开这个套接字,允许fd接收数据
end
​
--当一个客户端断开链接后调用该函数,必须要有
function handler.disconnect(fd)   skynet.error("fd:", fd, "disconnect")
end
​
--当fd有数据到达了,会调用这个函数,前提是fd需要调用gateserver.openclient打开
function handler.message(fd, msg, sz)skynet.error("recv message from fd:", fd)
​
end
​
gateserver.start(handler)

启动gate服务 并 需要告诉它监听端口

local gateserver = skynet.newservice("mygateserver")skynet.call(gateserver, "lua", "open", {   --需要给网关服务发送open消息,来启动监听port = 8002,            --监听的端口maxclient = 64,         --客户端最大连接数nodelay = true,         --是否延迟TCP
})

关闭gate服务

local skynet = require "skynet"
​
local gateserver = ...
skynet.start(function()skynet.call(gateserver, "lua",  "close")skynet.exit()
end)

客户端tcp连接gate监听端口
注意两点:
①snax.gateserver 基于TCP协议包装了一个两字节数据长度协议

前两个字节表示数据包的长度len(不计算这两个表示长度的字节),高字节在前低字节在后(大端序),后面紧跟len字节数的数据。

也就说,你给gate服务发消息,消息格式必须符合该协议,不然不会识别该消息!
消息打包方法:

local netpack = require "skynet.netpack" --使用netpack--(发送端)打包数据str,返回一个C指针msg,sz,申请内存
netpack.pack(str)
​
--(接收端)解包数据,返回一个lua的字符串,会释放内存
netpack.tostring(msg, sz)

客户端实例

local skynet = require "skynet"
local socket = require "skynet.socket"
local netpack = require "skynet.netpack"skynet.start(function()local addr = "127.0.0.1:8002"skynet.error("connect ".. addr)local id  = socket.open(addr)assert(id)socket.write(id, netpack.pack("Hello world"))
end)

介绍gete服务的那些handle们

详细代码参考

--当一个新客户端被accept后,connect 方法会被回调。 fd 是socket句柄 (不是系统fd). ipaddr是客户端地址, 例如 "127.0.0.1:8000".
function handler.connect(fd, ipaddr)   --当一个客户端断开链接后调用该函数,必须要有
function handler.disconnect(fd)   --当fd有数据到达了,会调用这个函数,前提是fd需要调用gateserver.openclient打开
function handler.message(fd, msg, sz)--如果你希望在监听端口打开的时候,做一些初始化操作,可以提供 open 这个方法。
--source 是请求来源地址,conf 是开启 gate 服务的参数表(端口,连接数,是否延迟)。
function handler.open(source, conf)--当一个连接异常(通常意味着断开),error 被调用,除了 fd ,还会拿到错误信息 msg(通常用于 log 输出)。
function handler.error(fd, msg)--当 fd 上待发送的数据累积超过 1M 字节后,将回调这个方法。你也可以忽略这个消息。
function handler.warning(fd, size)--gateserver除了能接收socket消息以为,当然也是可以接受skynet的lua消息,并且gateserver还对lua消息注册函数进行了封装,只需提供handler.command回调函数就能处理lua消息,不需要我们自己调用skynet.dispatch来注册。function CMD.kick(source, fd)function handler.command(cmd, source, ...)local f = assert(CMD[cmd])return f(source, ...)
end

具体的实现参考

其中 watchdog.lua 在文件夹 skynet/examples 下 gate.lua 在
skynet/service文件夹下,gateserver.lua 在 skynet/lualib/snax 文件夹下。

gate服务里面启动一个agent

gate服务写法

--注册client消息专门用来将接收到的网络数据转发给agent,不需要解包,也不需要打包
skynet.register_protocol {   name = "client",id = skynet.PTYPE_CLIENT,
}function handler.connect(fd, ipaddr)   gateserver.openclient(fd)local agent = skynet.newservice("myagent", fd) --连接成功就启动一个agent来代理agents[fd] = agent
end
​
function handler.disconnect(fd) --断开连接后,agent服务退出local agent = agents[fd]if(agent) then--通过发送消息的方式来退出不要使用skynet.kill(agent)skynet.send(agent, "lua", "quit")agents[fd] = nilend
end
​
function handler.message(fd, msg, sz)local agent = agents[fd]skynet.redirect(agent, 0, "client", 0, msg, sz) --收到消息就转发给agent
end

agent写法

skynet.start(function()--注册client消息专门用来接收网络数据skynet.dispatch("client", function(_,_, msg) func1(msg)end)
​skynet.dispatch("lua", function(_,_, cmd) --注册lua消息,来退出服务if cmd == "quit" thenskynet.error(fd,"agent quit")skynet.exit()endend)
end)

小结

个人看法:skynet网关服务这一块主要是为了解决网络通信的问题,处理网络请求,目前了解的还不够深,如果想更好的理解,应该仔细研究
注: 这个模板不可以和 Socket 库一起使用。因为这个模板接管了 socket 类的消息。

watchdog.lua 在文件夹 skynet/examples 下
gate.lua 在 skynet/service 文件夹下
gateserver.lua 在 skynet/lualib/snax 文件夹下

本篇博客参考:
https://blog.csdn.net/hp_cpp/article/details/107364207
https://blog.csdn.net/qq769651718/article/details/79435075
https://github.com/cloudwu/skynet/wiki/GateServer

平台开发——skynet——⑤网关服务gate相关推荐

  1. 平台开发——skynet——④socket通信、以及高度封装的socket.channel

    本文目录 预备知识: socket服务端 socket客户端 socket.channel模式(针对客户端) 用 socket.channel 解决问题① 用 socket.channel 解决问题② ...

  2. 高层次人才一站式服务平台开发 人才综合服务云平台建设

    为了更好的提高各省市区县人才环境.优化人才引进机制,拓展高层次人才服务,促进引才政策兑现落实,激励高层次人才创新创业,构建人才一站式服务平台,按照"统一规划.分步实施:数据集中.服务整合:标 ...

  3. API开发平台,企业级API服务发布平台

    API开发平台基于微服务架构快速开发API接口服务,是一款轻量级的API服务发布平台.可快速的开发企业级前后端分离的业务系统,通过建立数据模型和业务模型能够无代码快速的发布API服务. RestClo ...

  4. python角谷猜想递归实现_全新.NET Core平台开发逆袭 重新认知.NET Core微服务架构视频教程 架构师级课程...

    全新.NET Core平台开发逆袭课程,将带领同学们重新认知.NET Core微服务架构,是真正的架构师级别的开放课程.课程为同学们打造了一个非常好的框架的起点,重点内容包括了容器环境下配置注入的最佳 ...

  5. .net erp(办公oa)开发平台架构之流程服务概要介绍

    背景 搭建一个适合公司erp业务的开发平台. 架构概要图:     流程引擎开发平台:   包含流程引擎设计器,流程管理平台,流程引擎服务.目前只使用单个数据库进行管理.   流程引擎设计器 采用si ...

  6. 微信公众平台开发中提示“该公众号提供的服务出现故障”问题解决

    问题描述: 在处理室内数据推送的时候,服务器能正常接收并处理请求,,客户端也能正常接收消息 但是在每次收到消息后,微信界面会出现,"该公众号提供的服务出现故障"字样. 解决思路一: ...

  7. 微信公共服务平台开发(.Net 的实现)13-------网页授权(下 :C#代码的实现 )

    接着上次的理论,我们这次来研究用代码实现"网页授权获取用户基本信息",首先我们需要一个链接指向微信的授权页面,在微信开发平台中已经说了,这个链接必须在微信客户端中打开,那么我们就干 ...

  8. 微信第三方服务平台开发(一)

    工作中遇到开发微信第三方服务的需求,学习的同时记录一下开发的过程,给大家提供一个参考,希望能有些帮助,让大家少走些弯路. 首先说下开发流程,微信公众平台提供了大量的第三方接口供开发者调用,可以丰富微信 ...

  9. 低代码开发平台如何支撑微服务/云原生架构

    目前"低代码"."微服务"这两个IT词汇很流行,国内主流的低代码开发平台很多:宜搭.简道云.明道云.云程.氚云.伙伴云.道一云.JEPaaS.华炎魔方.搭搭云. ...

最新文章

  1. HTTP协议中的chunked编码解析
  2. Java基础--定时任务Timer
  3. 某年轻程序员吐槽大龄程序员“太水”:技术水平低,经验都过时,看不起新人,不服从管理!...
  4. 年度第一效率神器:你一定不想错过它!
  5. sqlalchemy 使用mysql_使用SQLALchemy连接MySql数据库并进行操作
  6. jira+mysql配置
  7. 【Android布局】在程序中设置android:gravity 和 android:layout_Gravity属性
  8. SAP CRM Division customizing
  9. Opencv 中 Mat中元素的值读取方法总结
  10. 视频编解码(十二):播放器编解码流程source、demux、decoder、output
  11. 计算机专业c类大学,【计算机应用技术】专业排名A+、A、B+、B、C类院校分数线...
  12. 酷狗显示服务器失败怎么回事,酷狗音乐上传音乐失败怎么回事
  13. java tomcat热部署_intellij idea tomcat热部署配置教程
  14. SAP ABAP 输出设备设置 LP01
  15. 基于EasyNVR实现RTSP/Onvif监控摄像头Web无插件化直播监控
  16. Android 和风天气+腾讯地图
  17. Android基础| 1G-4G的介绍
  18. PPT文件不能编辑如何解决?
  19. python写邮箱系统_Python django实现简单的邮件系统发送邮件功能
  20. 2020年中国无缝钢管行业发展现状及竞争格局分析,天津钢管产量领先,居国内首位「图」

热门文章

  1. 服务器的系统信息命令 厂家,查看云服务器系统的命令行
  2. 《JavaScript 闯关记》
  3. BPM软件_财务报销流程管理解决方案_K2工作流引擎
  4. 关于Yolov5在测试时,图像大小被调整的问题
  5. solidworks插件打包及简单的注册、解码、混淆、脱壳。
  6. AquaCrop_原理学习笔记01:AquaCrop模型简介
  7. 触觉马达DRV2605
  8. 激活window10专业版的方法。
  9. 微软最完善,百度最小气 看微软阿里百度三大物联网云平台对比
  10. 最快下载微软必应Bing搜索背景图片的方法