1. reply -- request
简单的一问一答模式,
客户端(ZMQ_REQ) 提交一个请求, 然后等待服务器(ZMQ_REP) 响应,
然后此时服务器收到客户端请求, 然后做出回应
代码
服务端 server.c
#include <assert.h>
#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <zmq.h>
int main(){
void *context = zmq_ctx_new();
void *responder = zmq_socket(context, ZMQ_REP);
int rc = zmq_bind(responder, "tcp://*:5555");
assert(rc == 0);
while(1){
char buf[10];
memset(buf, 0, 10);
zmq_recv(responder, buf, 10, 0);
printf("responder recv: %s\n", buf);
sleep(1);
zmq_send(responder, "s:reply", 7, 0);
}
return 0;
}
客户端 client.c
#include <assert.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <zmq.h>
int main(int argc, char const *argv[]) {
void *context = zmq_ctx_new();
void *requester = zmq_socket(context, ZMQ_REQ);
/* 这里连接的地址需要更换成自己要连接服务器的地址 */
int rc = zmq_connect(requester, "tcp://192.168.64.37:5555");
assert(rc == 0);
char msg[10] = "hello ser";
for(int i = 0; i < 10; i++){
printf("sending msg\n");
rc = zmq_send(requester, msg, strlen(msg), 0);
assert(rc > 0);
/* 接受回应 */
char buf[10];
memset(buf, 0, 10);
zmq_recv(requester, buf, 10, 0);
printf("recv: %s\n", buf);
}
return 0;
}
注意这里的模式.
**ZMQ_REP ( zmq_reply): **
用于服务端接收客户端请求, 发送自己响应内容的.
ZMQ_REQ(zmq_request):
用于客户端发送请求, 接收服务器响应
.
二者都是双向, 也就是能收能发(消息), 但是模式是 send...recv....send....recv...... 这样连续的.
不能客户端一直 send 请求, 服务器一直 recv 请求, 这样是会出错的.
因为游戏就是这么设定的.
你可以先开启服务端, 再开启客户端, 相反的顺序也是一样可以工作的.
但是如果你用 Ctrl + C 终止服务器, 在重新开启的话, 客户端就无法工作了, 这里需要以后更深入的研究.
你也可以试着开启多个客户端试一试
2. subscriber -- publisher
更新中...