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