没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
ZeroMQ 指南:第 1 章:基本概
念
本文是阅读
的笔记。
1 拯救世界(Fixing the World)
如何解释 ?
用它可以完成的精彩的事情来解释: 是打了激素的套接字(
); 是带有路由的邮箱。
用人们对它的评价来解释: 很快;复杂性不见了, 让事情变得简单;
解放了思维。
通过比较来解释: 更小、更简单。
而文档作者带领大家回忆为什么创造 ,因为当时作者所处的境况跟读者今天的
境况非常相似。
编程是穿上盛装的一门科学,好像艺术一样,因为大部分人不理解软件的本质,也
没有人告诉他们。软件的本质不是算法、数据结构、语言和抽象。软件只是我们创建、使
用、丢弃的工具。软件的本质就是人类的本质。软件变得复杂的时候,人们将其划分成容
易理解和使用的部分,从而可以相互合作,解决非常大的问题。
现代软件需要运行在互联的世界中。代码仅仅“强壮而沉默! "#是不够
的。代码需要相互交流。代码要像人类大脑一样工作(数万亿的神经细胞各自独立地处理
消息):没有中央控制的高度并行的网络,没有单点故障,可以解决非常复杂的问题。
但是,如果还是使用线程、协议、网络等来创建软件,则这个目标就像一场梦一样
几乎没法达到。即使是使用少量套接字连接少量程序都很不好搞。万亿数量级?开销是没
法想象的。计算机互联太难,解决这个问题的软件和服务需要耗费数十亿美元。
开源软件让我们可以有效地共享知识,解决了上世纪 $ 年代的软件危机。但是今天
我们面临另一场软件危机。只有大的、富有的公司可以创建互联的应用,也就是云。虽然
国际互联网提供了大量潜在互联的节点,但是大部分人没法有效地利用它们:没有把代码
联系起来的方法,无法把大脑连接起来解决大的问题(健康、教育、经济、运输等等)。
人们企图用很多方法来解决软件互联的挑战:成千上万的 %&' 规范,每个都解决问
题的一部分。
直到今天,人们依然使用原始的 ()* 和 &+*,以及 ,&&*、-./ 等专利协议来
连接应用程序。过程还是痛苦的,进度缓慢,难以扩展,并且潜在的是中心化的。分布式
的 ** 体系主要是闹着玩的,而不是用来工作的。
要拯救这个世界,需要做两件事:
解决“如何在任何地点连接任何代码到任何代码(0 1 12
10)”的问题
将解决方法封装到尽可能简单的建造块中,让人们容易理解和使用
看起来像个嵌入的网络库,但是起到了并发框架的作用。 提供可以
在进程内、进程间、&+* 和多播等各种传输端点间传递消息的套接字。使用扇出、发布3订
阅、任务分布、请求3回应等模式,可以对套接字进行 4 到 4 连接。 很快,足以用
于集群产品。 的异步 5 模型让你可以扩展到多核应用,就像异步消息处理任务一
样。 有多种语言的 6*,可以运行在大多数操作系统中。 来自 78,使用
9:*9 开源协议。
2 获取示例代码
示例代码在 : 代码仓库中。最简单的方法是克隆代码仓库:
3 请求-回应模式
从一个简单例子开始:客户端发送 , 给服务器;服务器回应 -。
3.1 服务器代码
#include <zmq.h>
#include <zmq_helpers.h>
#include <stdio.h>
#pragma comment(lib,"libzmq-v100-mt.lib")
int main(void){
void* ctx = zmq_ctx_new();
void* responder = zmq_socket(ctx,ZMQ_REP);
zmq_bind(responder,"tcp://*:5555");
while(1){
zmq_msg_t request;
zmq_msg_init(&request);
zmq_recvmsg(responder,&request,0);
printf("收到%s\n",(char*)zmq_msg_data(&request));
zmq_msg_close(&request);
s_sleep(1000);
zmq_msg_t reply;
zmq_msg_init_size(&reply,6);
memcpy(zmq_msg_data(&reply),"World",6);
printf("发送 World\n");
zmq_sendmsg(responder,&reply,0);
zmq_msg_close(&reply);
}
zmq_close(responder);
zmq_ctx_destroy(ctx);
return 0;
}
以上是使用 + 语言的服务器代码,当然也可以使用 +;;、*1 、*,* 等语言来编写
服务器。例如,+;;代码如下:
3.2 客户端代码
#include <zmq.h>
#include <zmq_helpers.h>
#include <stdio.h>
#pragma comment(lib,"libzmq-v100-mt.lib")
int main(void){
void* ctx = zmq_ctx_new();
void* client = zmq_socket(ctx,ZMQ_REQ);
zmq_connect(client,"tcp://localhost:5555");
for(int idx = 0; idx < 10; ++idx){
zmq_msg_t request;
zmq_msg_init_size(&request,6);
memcpy(zmq_msg_data(&request),"Hello",6);
printf("发送 Hello\n");
zmq_sendmsg(client,&request,0);
zmq_msg_close(&request);
zmq_msg_t reply;
zmq_msg_init(&reply);
zmq_recvmsg(client,&reply,0);
printf("收到%s\n",(char*)zmq_msg_data(&reply));
zmq_msg_close(&reply);
}
zmq_close(client);
zmq_ctx_destroy(ctx);
return 0;
}
编程中, 套接字代替了 &+* 套接字。
3.3 关于字符串
并不了解要发送的数据的格式,而只是知道其字节大小。
+ 语言中,字符串由一个空字节表示结束。可以这样发送带空字节结束标志的 + 字符
串:
但是,使用其他语言编程时,字符串可能不带空字节结束标志。比如说,用 *1
发送同样的字符串:
字符串带有长度前缀,在线路上发送的时候没有空字节结束标志:
+ 语言中正确接收 字符串的代码:ŽŽ
static char *s_recv (void *socket) {
zmq_msg_t message;
zmq_msg_init (&message);
if (zmq_recvmsg (socket, &message, 0) <= 0)
return (NULL);
int size = zmq_msg_size (&message);
char *string = (char*)malloc (size + 1);
memcpy (string, zmq_msg_data (&message), size);
zmq_msg_close (&message);
string [size] = 0;
return (string);
}
同理,+ 语言中发送字符串的代码:
static int s_send (void *socket, char *string) {
int rc;
zmq_msg_t message;
zmq_msg_init_size (&message, strlen (string));
memcpy (zmq_msg_data (&message), string, strlen (string));
rc = zmq_sendmsg (socket, &message, 0);
zmq_msg_close (&message);
return (rc);
}
辅助代码文件 :
.78..8+
3.4 报告 ZeroMQ 版本
4 发布-订阅模式
第二种典型的模式是单方数据发布:服务器把更新推送到一系列客户端。来看一个
推送包含邮政编码、温度、相对湿度的天气更新的示例。
4.1 服务器代码
#include <zmq.h>
#include <zmq_helpers.h>
#include <stdio.h>
#pragma comment(lib,"libzmq-v100-mt.lib")
int main(void){
void* ctx = zmq_ctx_new();
void* publisher = zmq_socket(ctx,ZMQ_PUB);
zmq_bind(publisher,"tcp://*:5556");
srand((unsigned int)time(NULL));
while(1){
int zipcode,temperature,relhumidity;
zipcode = randof(10);
temperature = randof(215) - 80;
relhumidity = randof(50) + 10;
char report[20];
snprintf(report,20,"%d %d %d",zipcode,temperature,relhumidity);
printf("发布天气预报: %s\n",report);
s_send(publisher,report);
}
zmq_close(publisher);
zmq_ctx_destroy(ctx);
return 0;
}
剩余63页未读,继续阅读
资源评论
deaglebear
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功