skynet:服务间相互调用与转交socket控制权

socket.abandon(id):用于清除 socket id 在本服务内的数据结构,但并不关闭这个 socket ,可用于向其他服务转交socket控制权。

目录结构与文章:skynet:socket 测试 保持一致,区别在于修改文件:service_gate.lua,并在 service 目录下新增文件:agent1.lua。

一、service_gate.lua

local skynet = require "skynet"
local socket = require "skynet.socket"

function accept(id, addr)
    print("accept connect from addr: " .. addr .. " id: " .. id)
    socket.start(id)
    
	skynet.newservice("agent1", id)
    -- notice: Some data on this connection(id) may lost before new service start.
    -- So, be careful when you want to use start / abandon / start .
    socket.abandon(id)
end

skynet.start(function()
    local listen_id = socket.listen("0.0.0.0", 8888)
    socket.start(listen_id , accept)
end)

服务 service_gate 在接收到客户端连接后,会创建一个新服务:agent1,并将 socket id 发送给新服务,同时使用 abandon 清除本服务内的 socket id。

二、agent1.lua

local skynet = require "skynet"
local socket = require "skynet.socket"

local fd = ...
fd = tonumber(fd)

local function echo(id)
    socket.start(id)

    while true do
        local str = socket.read(id)
        if str then
            print("client say:"..str)
            socket.write(id, str)
        else
            socket.close(id)
			print("client closed")
            return
        end
    end
end

skynet.start(function()
    skynet.fork(function()
        echo(fd)
        skynet.exit()
    end)
end)

服务 agent1 创建后,会使用 skynet.fork() 创建一个线程,线程函数:echo() 会持续对 socket id 进行监听,并将收到的消息返回给客户端,直至连接关闭。

三、测试

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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值