1.3. ★请求-应答模式(hwserver.c,hwclient.c)
作者:互联网
让我们从简单的代码开始,一段传统的Hello World程序。我们会创建一个客户端和一个服务器,客户端发送Hello给服务器,服务器返回World。下文是C语言编写的服务器,它在5555端口打开一个ZMQ套接字,等待请求,收到后应答World。
Example 1-1. Hello World server (hwserver.c)
// Hello World 服务器
// 绑定一个REP套接字至tcp://*:5555
// 从客户端接收Hello,并应答World
//
#include <zmq.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main (void)
{
void *context = zmq_init (1);
// 与客户端通信的套接字
void *responder = zmq_socket (context, ZMQ_REP);
zmq_bind (responder, "tcp://*:5555");
while (1) {
// 等待客户端请求
zmq_msg_t request;
zmq_msg_init (&request);
zmq_recv (responder, &request, 0);
printf ("Received Hello\n");
zmq_msg_close (&request);
// 做些“处理”
sleep (1);
// 返回应答
zmq_msg_t reply;
zmq_msg_init_size (&reply, 5);
memcpy (zmq_msg_data (&reply), "World", 5);
zmq_send (responder, &reply, 0);
zmq_msg_close (&reply);
}
// 程序不会运行到这里,以下只是演示我们应该如何结束
zmq_close (responder);
zmq_term (context);
return 0;
}
图1-1 请求应答模式
使用REQ-REP套接字发送和接受消息是相互关联的。客户端先调用zmq_send()发送消息,再用zmq_recv()接收,如此循环。如果打乱了这个顺序(如连续发送两次)则会报错。类似地,服务器必须先调用zmq_recv()接收消息,再调用zmq_send()。
下面是客户端的代码:
Example 1-6. Hello World client (hwclient.c)
// Hello World 客户端
// 连接REQ套接字至 tcp://localhost:5555
// 发送Hello给服务器,并接收World
#include <zmq.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
int main (void)
{
void *context = zmq_init (1);
// 连接至服务器的套接字
printf ("Connecting to hello world Server...\n");
void *requester = zmq_socket (context, ZMQ_REQ);
zmq_connect (requester, "tcp://localhost:5555");
int request_nbr;
for (request_nbr = 0; request_nbr != 10; request_nbr++) {
zmq_msg_t request;
zmq_msg_init_size (&request, 5);
memcpy (zmq_msg_data (&request), "Hello", 5);
printf ("Sending Hello %d...\n", request_nbr);
zmq_send (requester, &request, 0);
zmq_msg_close (&request);
zmq_msg_t reply;
zmq_msg_init (&reply);
zmq_recv (requester, &reply, 0);
printf ("Received World %d\n", request_nbr);
zmq_msg_close (&reply);
}
zmq_close (requester);
zmq_term (context);
return 0;
}
实现看起来太简单了,但ZMQ拥有超能力。理论上你可以连接千万个Client到这个Server上,同时连接都没问题,程序仍会运作得很好。可以先启动Client,然后在启动Server,程序依然能够运行。
让我简单介绍一下这两段程序做了什么。首先,他们创建了一个ZMQ上下文,然后是一个套接字。服务器将REP套接字绑定到5555端口上,并开始等待请求,发出应答。客户端则是发送请求并等待服务器的应答。
如果杀死服务器,并重启,客户端不能正确的恢复。从Crashing中恢复不容易,我们会在第四章中介绍。
这些代码背后其实发生了很多很多事情,但是程序员完全不必理会这些,只要知道这些代码短小精悍,极少出错,耐高压。这种通信模式我们称之为请求-应答模式,是ZMQ最直接的一种应用。
标签:hwserver,1.3,hwclient,request,msg,World,zmq,Hello,客户端 来源: https://blog.csdn.net/xillee388366/article/details/122760202