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 进行监听,并将收到的消息返回给客户端,直至连接关闭。
三、测试