005 ZeroMQ REQ-<ROUTER-Dealer>-REP代理应答与请求

来源:互联网 发布:佳博网络打印机设置 编辑:程序博客网 时间:2024/04/28 22:26

框架:
优点是,如果客户端是同型的,服务端也是同型的,都可以动态加入或退出。
但消息只实现一半路由,要完全路由,参考上一篇文章。
这里写图片描述

内部消息传递原理:
这里写图片描述
实现代码:
client.cpp:

#include<zmq.h>#include<iostream>#include<thread>#include<chrono>using std::endl;using std::cout;int main(){    void* pContext = zmq_ctx_new();    void* pReqSock = zmq_socket(pContext, ZMQ_REQ);    zmq_connect(pReqSock, "tcp://localhost:6601");    cout << "start client..." << endl;    while (true)    {        static int i = 0;        cout << "sent hello:" << i;        zmq_msg_t msgOut;        zmq_msg_init_size(&msgOut,16);        sprintf_s((char*)zmq_msg_data(&msgOut), 16, "hello%d", i++);        zmq_msg_send(&msgOut, pReqSock, 0);        zmq_msg_close(&msgOut);        zmq_msg_t msgIn;        zmq_msg_init(&msgIn);        zmq_msg_recv(&msgIn, pReqSock, 0);        cout << "----------receive:" << (char*)zmq_msg_data(&msgIn)<<endl;        zmq_msg_close(&msgIn);        std::this_thread::sleep_for(std::chrono::milliseconds(200));    }    zmq_close(pReqSock);    zmq_ctx_destroy(pContext);    return 0;}

proxy.cpp

#include<zmq.h>#include<iostream>using std::endl;using std::cout;int main(){    void* pContext = zmq_ctx_new();    void* frontEnd = zmq_socket(pContext, ZMQ_ROUTER);    zmq_bind(frontEnd, "tcp://*:6601");    void* backEnd = zmq_socket(pContext, ZMQ_DEALER);    zmq_bind(backEnd, "tcp://*:6602");    cout << "start proxy..." << endl;    zmq_proxy(frontEnd, backEnd, NULL);//为了省事就直接使用内置代理了,这里也可以手动实现zmq_poll,zmq_pollitem_t,参考前一篇手动实现代理过程,比较复杂。    zmq_close(frontEnd);    zmq_close(backEnd);    zmq_ctx_destroy(pContext);    return 0;}

server.cpp

#include<zmq.h>#include<iostream>using std::endl;using std::cout;int main(){    void* pContext = zmq_ctx_new();    void* pReqSock = zmq_socket(pContext, ZMQ_REP);    zmq_connect(pReqSock, "tcp://localhost:6602");    cout << "start server..." << endl;    while (true)    {        zmq_msg_t msgIn;        zmq_msg_init(&msgIn);        zmq_msg_recv(&msgIn, pReqSock, 0);        cout << "get:" << (char*)zmq_msg_data(&msgIn);        zmq_msg_close(&msgIn);        static int i = 0;        cout << "-----reply world:" << i<<endl;        zmq_msg_t msgOut;        zmq_msg_init_size(&msgOut, 16);        sprintf_s((char*)zmq_msg_data(&msgOut), 16, "world%d", i++);        zmq_msg_send(&msgOut, pReqSock, 0);        zmq_msg_close(&msgOut);    }    zmq_close(pReqSock);    zmq_ctx_destroy(pContext);    return 0;}
0 0
原创粉丝点击