hello-skynet之三:hello-slaves
上节我们可以给每个新连接上来的slave发送一条“hello, slaveN!”的消息,这一节我们继续深化这个主题,任务如下:
当有新的slave连接上来时,给所有的slave(包括新连接上来这个),发送“hello, slaveN!”的消息
本节任务在上节的基础上继续,主要用到DataCenter和Multicast两个概念/库。
1、复制hello-slave文件夹为hello-slaves,作为本节的新项目
2、修改hello-slaves下的 config-master.lua 和 config-slave.lua 文件,修改项目名:
...
----------------------------------
-- 自定义参数
----------------------------------
app_name = "hello-slaves"
...
3、给master-service和slave-service都引入前面提到的两个库:
...
local mc = require "multicast"
local dc = require "datacenter"
...
4、修改master-service.lua服务
在启动函数中添加创建 multicast 和 datacenter相 的代码
...
-- 生成多播频道, 并保存到 master.channel ,供 slaves 读取
svc.mc = mc.new()
dc.set("hello-slaves", "channel", svc.mc.channel)
在消息处理中添加多播消息的代码
svc.handler = function(session, address, cmd, id, ...)
skynet.error("["..skynet.address(address).."]", cmd, id, ...)
--将单播更改为广播到频道
--skynet.send(address, "lua", "hello, slave"..id)
svc.mc:publish("hello, slave"..id)
end
5、修改slave-service.lua服务
在启动入口处添加 datacenter项读取 和 多播消息处理
--服务入口
skynet.start(function()
-- 设置 lua 协议处理函数
skynet.dispatch("lua", svc.handler)
-- 创建并订阅多播频道
svc.mc = mc.new {
channel = dc.get("hello-slaves", "channel"),
dispatch = function (channel, source, ...)
skynet.error("["..skynet.address(source).."]", ...)
end,
}
svc.mc:subscribe()
--方式一,按句柄发消息
skynet.send(svc.master, "lua", "SLAVE", skynet.getenv "harbor")
--方式二,按名字发消息
--skynet.send("MASTER", "lua", "SLAVE", skynet.getenv "harbor")
end)
6、保存&测试
启动master:
hello-skynet simple$ skynet/skynet hello-slaves/config-master.lua<br />
再启动几个slave:
hello-skynet simple$ export harbor=2
hello-skynet simple$ skynet/skynet hello-slaves/config-salve.lua
hello-skynet simple$ export harbor=3
hello-skynet simple$ skynet/skynet hello-slaves/config-salve.lua
hello-skynet simple$ export harbor=4
hello-skynet simple$ skynet/skynet hello-slaves/config-salve.lua
master显示:
[:0100000a] [:02000008] SLAVE 2
[:01000004] connect from 127.0.0.1:51573 7
[:01000004] Harbor 3 (fd=7) report 127.0.0.1:7703
[:01000005] Connect to harbor 3 (fd=8), 127.0.0.1:7703
[:0100000a] [:03000008] SLAVE 3
[:01000004] connect from 127.0.0.1:51576 9
[:01000004] Harbor 4 (fd=9) report 127.0.0.1:7704
[:01000005] Connect to harbor 4 (fd=10), 127.0.0.1:7704
[:0100000a] [:04000008] SLAVE 4
slave2显示:
[:02000002] KILL self
[:02000008] [:0100000a] hello, slave2
[:02000004] Connect to harbor 3 (fd=4), 127.0.0.1:7703
[:02000008] [:0100000a] hello, slave3
[:02000004] Connect to harbor 4 (fd=5), 127.0.0.1:7704
[:02000008] [:0100000a] hello, slave4
[:02000004] Master disconnect
slave3显示:
[:03000002] KILL self
[:03000008] [:0100000a] hello, slave3
[:03000004] Connect to harbor 4 (fd=5), 127.0.0.1:7704
[:03000008] [:0100000a] hello, slave4
slave4显示:
[:04000002] KILL self
[:04000008] [:0100000a] hello, slave4
7、内容说明
* datacenter.set(...) 设置全局数据 * datacenter.get(...) 获取全局数据,不存在返回nil * datacenter.wait(...) 获取全局数据,不存在则等待,直到有数据时返回 * multicast.new(...) 创建新的多播 * multicast:subscribe() 开始接收多播数据 * multicast:publish(...) 发送多播数据
8、思考
一堆slave可以通讯了,是不是该“人类”介入了?;)
Written on May 13, 2015