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 進行監聽,並將收到的消息返回給客戶端,直至連接關閉。

三、測試

在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章