package main
import (
"fmt"
"github.com/pebbe/zmq4"
"sync"
)
func main() {
var wg sync.WaitGroup
context, _ := zmq4.NewContext()
defer context.Term()
// 创建发布者
publisher, _ := context.NewSocket(zmq4.PUB)
defer publisher.Close()
publisher.Bind("tcp://*:8888")
// 创建订阅者1
subscriber1, _ := context.NewSocket(zmq4.SUB)
defer subscriber1.Close()
subscriber1.Connect("tcp://localhost:8888")
subscriber1.SetSubscribe("")
// 创建订阅者2
subscriber2, _ := context.NewSocket(zmq4.SUB)
defer subscriber2.Close()
subscriber2.Connect("tcp://localhost:8888")
subscriber2.SetSubscribe("")
// 订阅者1接收消息
wg.Add(1)
go func() {
for {
msg, _ := subscriber1.RecvMessage(0)
fmt.Printf("Subscriber1 received: %s\n", msg[0])
}
wg.Done()
}()
// 订阅者2接收消息
wg.Add(1)
go func() {
for {
msg, _ := subscriber2.RecvMessage(0)
fmt.Printf("Subscriber2 received: %s\n", msg[0])
}
wg.Done()
}()
// 发布消息
publisher.Send("Hello from publisher!", 0)
wg.Wait()
}
在这个例子中,我们创建了一个 zeromq 的上下文(context),然后创建了一个发布者(publisher)和两个订阅者(subscriber1 和 subscriber2)。我们使用 Bind 和 Connect 方法将发布者和订阅者连接到相同的端点(endpoint)。在这个例子中,我们使用了 tcp 协议和 8888 端口。我们还使用了 SetSubscribe 方法来订阅所有消息。
在订阅者1和订阅者2中,我们使用了 RecvMessage 方法来接收消息,并打印出接收到的内容。在发布者中,我们使用 Send 方法来发送一条消息到订阅者。
最后,我们使用 sync.WaitGroup 来等待所有 goroutine 执行完毕。




