ZMQ专题学习之七:libzmq的请求应答代理模式通信方式
ZMQ专题学习之七:libzmq的请求应答代理模式通信方式
接上一节,前面一节介绍了介绍订阅代理的模式的实例,这一节就是将要请求应答代理模式的实例进行详细的说明。
请求应答代理的模式图如下:
第一步:先建立server工程文件,与上一节一样,建立一个testLibzmqRRServer工程,以控制台的项目方式建立。
第二步:参照上节论述,在建立好的工程文件夹中建立两个目录,include和lib两个文件夹。
然后分别把 zmq.h 和zmq_utils.h拷贝到includes文件夹,libzmq.lib和libzmq.dll拷贝到lib文件夹中。(具体从哪里考,这里就不啰嗦了,对于熟悉vs环境的人,一点就透)。
第三步:设置附加包含目录、附加链接库,调试过dll的人都懂的,不再赘述。
第四步:在建立的工程文件的cpp的文件中,添加如下代码;
// testLibzmqRRServer.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <assert.h>
#include <stdio.h>
#include "../include/zmq.h"
static int s_send (void *socket, char *string) {
int size = zmq_send (socket, string, strlen (string), 0);
return size;
}
char *s_recv (void *socket) {
char buffer [256];
int size = zmq_recv (socket, buffer, 255, 0);
if (size == -1)
return NULL;
buffer[size] = '\0';
return buffer;
}
int main (void)
{
void *context = zmq_ctx_new ();
// Socket to talk to clients
void *responder = zmq_socket (context, ZMQ_REP);
zmq_connect (responder, "tcp://localhost:5560");
char string[20];
while (1) {
// Wait for next request from client
strcpy(string,s_recv (responder));
printf ("Received request: [%s]\n", string);
// Do some 'work'
Sleep (1);
// Send reply back to client
s_send (responder, "World");
}
// We never get here, but clean up anyhow
zmq_close (responder);
zmq_ctx_destroy (context);
return 0;
}
第五步:编译后,会生成对应版本的,比如是release版本还是debug版本,32位,还是64位版本的exe。(本文为64位)
第六步:建立Broker的工程文件一个testLibzmqRRBroker工程,以控制台的项目方式建立。
第七步:同样的操作,在建立好的工程文件夹中建立两个目录,include和lib两个文件夹。
然后分别把 zmq.h 和zmq_utils.h拷贝到includes文件夹,libzmq.lib和libzmq.dll拷贝到lib文件夹中。(具体从哪里考,这里就不啰嗦了,对于熟悉vs环境的人,一点就透)。
第八步:设置附加包含目录、附加链接库,调试过dll的人都懂的,不再赘述。
第九步:在建立的工程文件的cpp的文件中,添加如下代码;
// testLibzmqRRBroker.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <assert.h>
#include <stdio.h>
#include "../include/zmq.h"
int main (void)
{
// Prepare our context and sockets
void *context = zmq_ctx_new ();
void *frontend = zmq_socket (context, ZMQ_ROUTER);
void *backend = zmq_socket (context, ZMQ_DEALER);
zmq_bind (frontend, "tcp://*:5559");
zmq_bind (backend, "tcp://*:5560");
// Initialize poll set
zmq_pollitem_t items [] = {
{ frontend, 0, ZMQ_POLLIN, 0 },
{ backend, 0, ZMQ_POLLIN, 0 }
};
printf("Broker start!\n");
// Switch messages between sockets
while (1) {
zmq_msg_t message;
zmq_poll (items, 2, -1);
if (items [0].revents & ZMQ_POLLIN) {
while (1) {
// Process all parts of the message
zmq_msg_init (&message);
zmq_msg_recv (&message, frontend, 0);
int more = zmq_msg_more (&message);
zmq_msg_send (&message, backend, more? ZMQ_SNDMORE: 0);
zmq_msg_close (&message);
printf("Process all parts of the message 0!\n");
if (!more)
break; // Last message part
}
}
if (items [1].revents & ZMQ_POLLIN) {
while (1) {
// Process all parts of the message
zmq_msg_init (&message);
zmq_msg_recv (&message, backend, 0);
int more = zmq_msg_more (&message);
zmq_msg_send (&message, frontend, more? ZMQ_SNDMORE: 0);
zmq_msg_close (&message);
printf("Process all parts of the message 1!\n");
if (!more)
break; // Last message part
}
}
}
// We never get here, but clean up anyhow
zmq_close (frontend);
zmq_close (backend);
zmq_ctx_destroy (context);
return 0;
}
第十步:编译后,会生成对应版本的,比如是release版本还是debug版本,32位,还是64位版本的exe。(本文为64位)
第十一步:建立client的工程文件一个testLibzmqRRClient工程,以控制台的项目方式建立。
第十二步:同样的操作,在建立好的工程文件夹中建立两个目录,include和lib两个文件夹。
然后分别把 zmq.h 和zmq_utils.h拷贝到includes文件夹,libzmq.lib和libzmq.dll拷贝到lib文件夹中。(具体从哪里考,这里就不啰嗦了,对于熟悉vs环境的人,一点就透)。
第十三步:设置附加包含目录、附加链接库,调试过dll的人都懂的,不再赘述。
第十四步:在建立的工程文件的cpp的文件中,添加如下代码;
// testLibzmqRRClient.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <assert.h>
#include <stdio.h>
#include "../include/zmq.h"
static int s_send (void *socket, char *string) {
int size = zmq_send (socket, string, strlen (string), 0);
return size;
}
char *s_recv (void *socket) {
char buffer [256];
int size = zmq_recv (socket, buffer, 255, 0);
if (size == -1)
return NULL;
buffer[size] = '\0';
return buffer;
}
int main (void)
{
void *context = zmq_ctx_new ();
// Socket to talk to server
void *requester = zmq_socket (context, ZMQ_REQ);
zmq_connect (requester, "tcp://localhost:5559");
char string[20];
int request_nbr;
for (request_nbr = 0; request_nbr != 10; request_nbr++) {
s_send (requester, "Hello");
strcpy(string,s_recv (requester));
printf ("Received reply %d [%s]\n", request_nbr, string);
}
getchar();
zmq_close (requester);
zmq_ctx_destroy (context);
return 0;
}
第十五步:编译后,会生成对应版本的,比如是release版本还是debug版本,32位,还是64位版本的exe。(本文为64位)
至此,已经把三个样例工程文件编译完毕,分别在各自的release或者debug目录执行exe文件,执行界面如下:
Server的显示界面
Broker的显示界面
Client的显示界面
上面三个图显示了发布订阅代理模式三个程序的相互通信的过程。
demo下载的地址:https://download.****.net/download/jyl_sh/12410095