定义框架:
实现:
服务端wuserver.cpp
#include<zmq.h>
#include<thread>
#include<chrono>
#include<iostream>
using std::endl;
using std::cout;
int main()
{
void* pContext = zmq_ctx_new();
void* pPubSocket = zmq_socket(pContext, ZMQ_PUB);
zmq_bind(pPubSocket, "tcp://*:5002");
cout << "pub server starting...\n";
while (true)
{
static int i = 0;
cout << "sending-" << i++ << endl;
int channel = 10086; //发送频道是10086
int channelSize = sizeof(channel);
char bufferMsg[] = "what a beautiful day";//要散播的消息;
int bufferMsgSize = sizeof(bufferMsg);
//发送2帧消息;其实只用一帧也可以,这里只是为了进一步说明用法;
//发送第一帧,第一帧封装的是[频道];
zmq_msg_t msgFrame01;
zmq_msg_init_size(&msgFrame01, channelSize);
memcpy(zmq_msg_data(&msgFrame01), &channel, channelSize);
zmq_msg_send(&msgFrame01, pPubSocket, ZMQ_SNDMORE);//ZMQ_SNDMORE表示这是连续帧,后面还有消息帧要发送;
zmq_msg_close(&msgFrame01);
//发送第二帧,是消息;
zmq_msg_t msgFrame2;
zmq_msg_init_size(&msgFrame2,bufferMsgSize);
memcpy(&msgFrame2, bufferMsg, bufferMsgSize);
zmq_msg_send(&msgFrame2, pPubSocket, 0);//第三个参数表示结束帧,后面不会有接续帧了;
zmq_msg_close(&msgFrame2);
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
}
zmq_close(pPubSocket);
zmq_ctx_term(pContext);
return 0;
}
客户端wuclient.cpp,运行的时候,客户端可以多开
#include<zmq.h>
#include<iostream>
using std::endl;
using std::cout;
int main()
{
void* pContext = zmq_ctx_new();
void* pSubSocket = zmq_socket(pContext, ZMQ_SUB);
zmq_connect(pSubSocket, "tcp://localhost:5002");
//设置接收频道;
int channel = 10086;
zmq_setsockopt(pSubSocket, ZMQ_SUBSCRIBE, &channel, sizeof(channel));
cout << "sub client receiving "<<endl;
while (true)
{
zmq_msg_t msgIn;
zmq_msg_init(&msgIn);
int size = zmq_msg_recv(&msgIn, pSubSocket, 0);
if (size==sizeof(channel))//因为会收到2帧,第一帧为频道,我们不处理。只处理打印第2帧。
{
zmq_msg_close(&msgIn);
continue;
}
cout << "receive:" << (char*)zmq_msg_data(&msgIn) << endl;
zmq_msg_close(&msgIn);
}
zmq_close(pSubSocket);
zmq_ctx_destroy(pContext);
return 0;
}
结果如下: