Lua PUB/SUB实现

使用luarocks安装这些库:lzmq, pl.lapp

1、如不需要查看发送或接受消息的时间,可以使用lzmq.timer

      将函数timeStamp()及其使用的地方删除即可

2、为简化验证,也可不使用命令行工具pl.lapp,将lapp部分删除,并将address用固定地址替换掉

publisher.lua 

--publisher.lua
local zmq = require("lzmq")
local timer = require("lzmq.timer")
local lapp = require("pl.lapp")
local zassert = zmq.assert
local args = lapp[[
    -a,--address    (default "tcp://127.0.0.1:10000")   Config module to load.
]]
local context = zmq.context()
local address = args.address
local zmq_pub,err = context:socket(zmq.PUB,{bind = address})
zassert(zmq_pub,err)
print("Create publisher server: ",address)

-- get the time stamp string wih format: %Y-%m-%d %H:%M:%S.ms
function timeStamp()
    local ms = timer.absolute_time() -- get ms use lzmp.timmer.absolute_time()
    local s = math.floor(ms/1000) -- second
    local date = os.date("%Y-%m-%d %H:%M:%S.", s) -- second to data
    local sub_ms = ms-s*1000 -- just ms
    return date..tostring(sub_ms)
end

-- publish message
while true do
    io.write("Publisher> ") -- prompt keyword: "Publisher> "
    io.flush()
    local cmd = io.read("*line") -- read message from cmd line
    if (cmd and #cmd>0) then
        local ret,err=zmq_pub:send("101",zmq.SNDMORE) -- zmq.SNDMORE: 表示发送的消息由多个消息帧组成
        local ret,err=zmq_pub:send(cmd.."\r\n")
        if (ret) then
            print(timeStamp(),"[SEND]:",cmd)
        else
            print("[ERROR]:",err)
        end
    end
end

subscriber.lua

-- subscriber.lua
local zmq = require("lzmq")
local timer = require("lzmq.timer")
local lapp = require("pl.lapp")
local zassert = zmq.assert
local zpoller = require("lzmq.poller")
local args = lapp[[
    -a,--address    (default "tcp://127.0.0.1:10000")   Config module to load.
]]
local context = zmq.context();
local address = args.address
local zmq_sub, err = context:socket{zmq.SUB, subscribe = "101"; connect = address; }
zassert(zmq_sub,err);
print("[Subscriber]: ","Create subscriber with address : ",address);
function timeStamp()
    local ms = timer.absolute_time()
    local s = math.floor(ms/1000)
    local date = os.date("%Y-%m-%d %H:%M:%S.", s)
    local sub_ms = ms-s*1000
    return date..tostring(sub_ms)
end

--poller()解决一个线程中有多个sokect同时需要收发数据时,不用在send()或者recv()时阻塞socket
--在recv()端接受信息的用zmq.POLLIN
--在send()端发送消息的用zmq.POLLOUT
local poller = zpoller.new(2)
--此处暂时只能用闭包函数,尝试单独写函数来实现时出错
poller:add(zmq_sub, zmq.POLLIN, function()
    io.write("Receiver> ")
    io.flush()
    print(timeStamp().."\t[REV:]\t"..zmq_sub:recv())
end)
poller:start()

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

auspark

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值