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.csdn.net/download/jyl_sh/12410095

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jyl_sh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值