ZeroMQ环境的搭建就不说了,之前已经说过。
来看ZeroMQ的“发布/订阅”模型的C++代码:
pub.cpp代码为:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <string.h>
#include "zmq.h"
int main()
{
void* context = zmq_ctx_new();
assert(context != NULL);
void* publisher = zmq_socket(context, ZMQ_PUB);
assert(publisher != NULL);
int ret = zmq_bind(publisher, "tcp://*:5555");
assert(ret == 0);
int i = 0;
while(1)
{
char szBuf[1024] = {0};
snprintf(szBuf, sizeof(szBuf), "server i=%d", i);
ret = zmq_send(publisher, szBuf, strlen(szBuf) + 1, 0);
i++;
sleep(1);
}
zmq_close (publisher);
zmq_ctx_destroy (context);
return 0;
}
sub.cpp代码为:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include "zmq.h"
int main()
{
printf("Hello world!\n");
void* context = zmq_ctx_new();
assert(context != NULL);
void* subscriber = zmq_socket(context, ZMQ_SUB);
assert(subscriber != NULL);
int ret = zmq_connect(subscriber, "tcp://localhost:5555");
assert(ret == 0);
ret = zmq_setsockopt(subscriber, ZMQ_SUBSCRIBE, "", 0);
assert(ret == 0);
while(1)
{
printf("into while\n");
char szBuf[1024] = {0};
ret = zmq_recv(subscriber, szBuf, sizeof(szBuf) - 1, 0);
if (ret > 0)
{
printf("%s\n", szBuf);
}
}
zmq_close(subscriber);
zmq_ctx_destroy(context);
return 0;
}
先启动发布者的话, 订阅者会错过部分消息,无法挽回。
来看看实际效果(开启了1个发布者和2个订阅者):
ubuntu@VM-0-15-ubuntu:~/taoge/zmq/test$ ./server
ubuntu@VM-0-15-ubuntu:~/taoge/zmq/test$ ./client
Hello world!
into while
server i=21
into while
server i=22
into while
server i=23
ubuntu@VM-0-15-ubuntu:~/taoge/zmq/test$ ./client
Hello world!
into while
server i=57
into while
server i=58
into while
server i=59
OK, 不多说。