回顾之前服务器端的TCP连接:
- socket.listen(address, port) 监听一个端口,返回一个 id ,供 start 使用。
- socket.start(id , accept) accept 是一个函数。每当一个监听的 id 对应的 socket 上有连接接入的时候,都会调用 accept 函数。这个函数会得到接入连接的 id 以及 ip 地址。你可以做后续操作。
socket 的 id 对于整个 skynet 节点都是公开的。也就是说,你可以把 id 这个数字通过消息发送给其它服务,其他服务也可以去操作它。任何一个服务只有在调用 socket.start(id) 之后,才可以收发这个 socket 上的数据。skynet 框架是根据最后调用 start 这个 api 的位置来决定把对应 socket 上的数据转发到哪里去的,任何时候只能有一个服务在收数据。
向一个 socket id 写数据也需要先调用 start ,但写数据不限制在调用 start 的同一个服务中。也就是说,你可以在一个服务中调用 start ,然后在另一个服务中向其写入数据。skynet 可以保证一次 write 调用的原子性。即,如果你有多个服务同时向一个 socket id 写数据,每个写操作的串不会被分割开。
检验多个服务写同一个 socket :
./examples/socket1.lua
local skynet = require "skynet"
local socket = require "socket"
local function accept2(id)
local agent2 = skynet.newservice("agent2")
skynet.send(agent2,"lua",id)
while true do
socket.write(id, "main")
skynet.sleep(100)
end
end
skynet.start(function()
print("==========Socket Start=========")
local id = socket.listen("12