【Skynet】socket与多服务

回顾之前服务器端的TCP连接:

  • socket.listen(address, port) 监听一个端口,返回一个 id ,供 start 使用。
  • socket.start(id , accept) accept 是一个函数。每当一个监听的 id 对应的 socket 上有连接接入的时候,都会调用 accept 函数。这个函数会得到接入连接的 id 以及 ip 地址。你可以做后续操作。


每当 accept 函数获得一个新的 socket id 后,并不会立即收到这个 socket 上的数据。这是因为,我们有时会希望把这个 socket 的操作权转让给别的服务去处理。

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值