skynet:网关服务 二

一、控制客户端连接数

在启动网关时,可指定当前服务的最大连接数,以避免大量用户登录到该服务。
在这里插入图片描述
启动网关服务后,运行三个 socketclient 客户端,结果如下:
在这里插入图片描述
可以看到,第三个客户端连接成功后,被立即关闭。

二、gateserver 其他回调函数

--[[
 gateserver监听成功后,会调用此接口,可用来进行一些初始化操作。
 source:请求来源地址,conf:开启 gateserver 的参数表(端口,连接数,是否延迟
 --]]
function handler.open(source, conf)
end
​

--[[
当一个连接异常(通常意味着断开),会调用此接口。
msg:错误信息(通常用于 log 输出)。
]]--
function handler.error(fd, msg)
end
​

--当 fd 上待发送的数据累积超过 1M 字节后,将回调这个方法。
function handler.warning(fd, size)
end

mygateserver.lua

local skynet = require "skynet"
local gateserver = require "snax.gateserver"
local netpack = require "skynet.netpack"
​
local handler = {}--当一个客户端链接进来,gateserver自动处理链接,并且调用该函数
function handler.connect(fd, ipaddr)   
    skynet.error("ipaddr:",ipaddr,"fd:",fd,"connect")
    gateserver.openclient(fd)
end
​
--当一个客户端断开链接后调用该函数
function handler.disconnect(fd)
    skynet.error("fd:", fd, "disconnect")
end
​
​
--接收数据
function handler.message(fd, msg, sz)
    skynet.error("recv message from fd:", fd)
    --把 handler.message 方法收到的 msg,sz 转换成一个 lua string,并释放 msg 占用的 C 内存。
    skynet.error(netpack.tostring(msg, sz))   
end
​
--如果报错就关闭该套接字
function handler.error(fd, msg)
    gateserver.closeclient(fd)
end
​
--fd中待发送数据超过1M时调用该函数,可以不处理
function handler.warning(fd, size)
    skynet.skynet("warning fd=", fd , "unsent data over 1M")
end
​
--一旦gateserver打开监听成功后就会调用该接口
--testmygateserver.lua通过给mygateserver.lua发送lua消息open触发该函数调用
function handler.open(source, conf) 
    skynet.error("open by ", skynet.address(source))
    skynet.error("listen on", conf.port)
    skynet.error("client max", conf.maxclient)
    skynet.error("nodelay", conf.nodelay)
end
​
gateserver.start(handler)

测试:
在这里插入图片描述

三、向 gateserver 发送lua消息

gateserver 不仅能接收 socket 消息,还能接收 skynet lua 消息,并且 gateserver 对 lua 消息注册函数进行了封装,只需提供 handler.command 回调函数即可,而不需要我们自己调用 skynet.dispatch 来注册。

3.1、在 mygateserver.lua 中增加以下部分:

local CMD = {}


function CMD.kick(source, fd)
        skynet.error("source:", skynet.address(source), "kick fd:", fd)
        gateserver.closeclient(fd)
end

function handler.command(cmd, source, ...)
        local f = assert(CMD[cmd])
        return f(source, ...)
end

3.2、再编写一个给 mygateserver 发送命令的服务:kickmygateserver.lua:

local skynet = require "skynet"


local gateserver, fd= ... --必须要转换成整形数,skynet命令行传入的参数都是字符串

fd = tonumber(fd)

skynet.start(function()
        skynet.call(gateserver, "lua",  "kick", fd)
         skynet.exit()
end)

这个脚本的功能是,由命令行启动服务 kickmygateserver,并向指定的服务发送消息。

3.3、修改 main.lua,以支持用命令行启动服务:.

local skynet = require "skynet"
--local sprotoloader = require "sprotoloader"


skynet.start(function()
        skynet.error("Server start")

        if not skynet.getenv "daemon" then
                local console = skynet.newservice("console") -- 创建控制台
        end

        local gateserver = skynet.newservice("myservice/mygateserver")
        skynet.call(gateserver, "lua", "open", {
                port = 8002,
                maxclient = 4096,
                nodelay = true,
         })

        skynet.error("gate server setup on", 8002)
        skynet.exit()
end)

3.4、测试:
先启动 mygateserver,然后启动客户端 socketclient,最后再返回 mygateserver 并输入命令:

myservice/kickmygateserver :0000000a 3

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值