ZeroMQ使用学习记录(转)
ZMQ简介
ZMQ(ØMQ、ZeroMQ, 0MQ)看起来像是一套嵌入式的网络链接库,但工作起来更像是一个并发式的框架。它提供的套接字可以在多种协议中传输消息,如线程间、进程间、TCP、广播等。你可以使用套接字构建多对多的连接模式,如扇出、发布-订阅、任务分发、请求-应答等。ZMQ的快速足以胜任集群应用产品。它的异步I/O机制让你能够构建多核应用程序,完成异步消息处理任务。ZMQ有着多语言支持,并能在几乎所有的操作系统上运行。ZMQ是iMatix公司的产品,以LGPL开源协议发布。
主要有下列三种模式
1.Request-Reply模式:请求响应模式
客户端在请求后,服务端必须回响应

server:
1 #!/usr/bin/python
2 #-*-coding:utf-8-*-
3 import time
4 import zmq
5
6 context = zmq.Context()
7 socket = context.socket(zmq.REP)
8 socket.bind("tcp://*:5555")
9
10 while True:
11 message = socket.recv()
12 print message
13 #time.sleep(1)
14 socket.send("server response!")
client:
1 #!/usr/bin/python
2 #-*-coding:utf-8-*-
3
4 import zmq
5 import sys
6
7 context = zmq.Context()
8 socket = context.socket(zmq.REQ)
9 socket.connect("tcp://localhost:5555")
10
11 while(True):
12 data = raw_input("input your data:")
13 if data == 'q':
14 sys.exit()
15
16 socket.send(data)
17
18 response = socket.recv();
19 print response
2.Publish-Subscribe模式:发布订阅模式
广播所有client,没有队列缓存,断开连接数据将永远丢失。client可以进行数据过滤。

server:
1 #!/usr/bin/python
2 #-*-coding:utf-8-*-
3
4 import zmq
5 context = zmq.Context()
6 socket = context.socket(zmq.PUB)
7 socket.bind("tcp://127.0.0.1:5000")
8 while True:
9 msg = raw_input('input your data:')
10 socket.send(msg)
client:
1 #!/usr/bin/python
2 #-*-coding:utf-8-*-
3
4 import time
5 import zmq
6 context = zmq.Context()
7 socket = context.socket(zmq.SUB)
8 socket.connect("tcp://127.0.0.1:5000")
#此处进行过滤,socket.setsockopt(zmq.SUBSCRIBE, "A")表示只接收信息中头部为A的信息,其他的省略
9 socket.setsockopt(zmq.SUBSCRIBE,'')
10 while True:
11 print socket.recv()
关于发布-订阅模式的几点说明:
- 订阅者可以连接多个发布者,轮流接收消息;
- 如果发布者没有订阅者与之相连,那它发送的消息将直接被丢弃;
- 如果你使用TCP协议,那当订阅者处理速度过慢时,消息会在发布者处堆积。以后我们会讨论如何使用阈值(HWM)来保护发布者。
- 在目前版本的ZMQ中,消息的过滤是在订阅者处进行的。也就是说,发布者会向订阅者发送所有的消息,订阅者会将未订阅的消息丢弃。
3.Parallel Pipeline模式:管道模式
由三部分组成,push进行数据推送,work进行数据缓存,pull进行数据竞争获取处理。区别于Publish-Subscribe存在一个数据缓存和处理负载。
当连接被断开,数据不会丢失,重连后数据继续发送到对端。

server:
1 #!/usr/bin/python
2 #-*-coding:utf-8-*-
3
4 import zmq
5
6 context = zmq.Context()
7
8 socket = context.socket(zmq.PULL)
9 socket.bind('tcp://*:5558')
10
11 while True:
12 data = socket.recv()
13 print data
work:
1 #!/usr/bin/python
2 #-*-coding:utf-8-*-
3
4 import zmq
5
6 context = zmq.Context()
7
8 recive = context.socket(zmq.PULL)
9 recive.connect('tcp://127.0.0.1:5557')
10
11 sender = context.socket(zmq.PUSH)
12 sender.connect('tcp://127.0.0.1:5558')
13
14 while True:
15 data = recive.recv()
16 sender.send(data)
client:
1 #!/usr/bin/python
2 #-*-coding:utf-8-*-
3
4 import zmq
5 import time
6
7 context = zmq.Context()
8 socket = context.socket(zmq.PUSH)
9
10 socket.bind('tcp://*:5557')
11
12 while True:
13 data = raw_input('input your data:')
14 socket.send(data)
转自http://www.cnblogs.com/binchen-china/p/5643531.html
按个人理解简要描述下三种模式的区别,应答模式就是普通的socket套接字请求回应,发布订阅模式可以对服务器的信息进行过滤,管道模式通过一个第三方来存储客户端发送,服务器端接受的数据,提供一个缓存的作用。弥补了广播订阅模式在客户端无法收到下线到再次上线之间服务器端的数据的缺陷。

ZeroMQ使用学习记录(转)的更多相关文章
- zeromq学习记录(一)最初的简单示例使用ZMQ_REQ ZMQ_REP
阅读zeromq guide的一些学习记录 zeromq官方例子 在VC下运行会有些跨平台的错误 我这里有做修改 稍后会发布出来 相关的代码与库 http://download.zeromq.org ...
- Quartz 学习记录1
原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...
- Java 静态内部类与非静态内部类 学习记录.
目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合 ...
- Apache Shiro 学习记录4
今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了.... ...
- UWP学习记录12-应用到应用的通信
UWP学习记录12-应用到应用的通信 1.应用间通信 “共享”合约是用户可以在应用之间快速交换数据的一种方式. 例如,用户可能希望使用社交网络应用与其好友共享网页,或者将链接保存在笔记应用中以供日后参 ...
- UWP学习记录11-设计和UI
UWP学习记录11-设计和UI 1.输入和设备 通用 Windows 平台 (UWP) 中的用户交互组合了输入和输出源(例如鼠标.键盘.笔.触摸.触摸板.语音.Cortana.控制器.手势.注视等)以 ...
- UWP学习记录10-设计和UI之控件和模式7
UWP学习记录10-设计和UI之控件和模式7 1.导航控件 Hub,中心控件,利用它你可以将应用内容整理到不同但又相关的区域或类别中. 中心的各个区域可按首选顺序遍历,并且可用作更具体体验的起始点. ...
- UWP学习记录9-设计和UI之控件和模式6
UWP学习记录9-设计和UI之控件和模式6 1.图形和墨迹 InkCanvas是接收和显示墨迹笔划的控件,是新增的比较复杂的控件,这里先不深入. 而形状(Shape)则是可以显示的各种保留模式图形对象 ...
- UWP学习记录8-设计和UI之控件和模式5
UWP学习记录8-设计和UI之控件和模式5 1.日历.日期和时间控件 日期和时间控件提供了标准的本地化方法,可供用户在应用中查看并设置日期和时间值. 有四个日期和时间控件可供选择,选择的依据如下: 日 ...
随机推荐
- [CF949C]Data Center Maintenance
题目大意:$n$个点,每个点有一个值$w_i$.$m$个条件,每个条件给出$x,y$,要求$w_x\not =w_y$.选择最少的点,使其值加$1$后,所有条件成立(数据保证有解). 题解:对于每个条 ...
- uoj185 [ZJOI2016]小星星 【dp + 容斥】
题目链接 uoj185 题解 设\(f[i][j]\)表示\(i\)为根的子树,\(i\)号点对应图上\(j\)号点时的方案数 显然这样\(dp\)会使一些节点使用同一个节点,此时总的节点数就不满\( ...
- 重复登录Windows远程桌面-Autoit脚本
非常抱歉,我先临时把脚本放上来,具体的说明有时间再更新: 都是做成快捷方式,用鼠标点击的操作 #include <AutoItConstants.au3> ; Open mstsc pro ...
- 怎么用SecureCRT这个工具把linux服务器的压缩文件下载到本地的一个路径。
依次按上图中所示的突变,进入sftp的命令界面.输入help命令:即:sftp>help得到如下的截图. 比较重要的命令有:cd----查询服务器端的路径 lcd---查询本地的地址 pwd:服 ...
- 怎么用tomcat对socket接口的程序进行调试
对socket(套接字)的demo方法大多都是用main方法进行测试的,那如何用tomcat进行测试呢? 这里需要借助一个工具:工具的名字是:Sockettool.exe .下图是该工具的内容.连上监 ...
- C++封装随笔
1接口的封装和设计思想入门 接口的封装和设计思想入门 第一套api函数 #ifndef _CLT_SOCKET_H__ #define _CLT_SOCKET_H__ //客户端初始化环境 int c ...
- 洛谷P1160 队列安排
题目描述 一个学校里老师要将班上N个同学排成一列,同学被编号为1-N,他采取如下的方法: 1.先将1号同学安排进队列,这时队列中只有他一个人: 2.2-N号同学依次入列,编号为i的同学入列方式为:老师 ...
- [摸鱼] 配置的vim的使用攻略!
vim使用攻略 <>=f 折叠与缩进 开:<>[^fuck]cc 关:<>cu 缩进一块使用V选中,按>> [Ctrl]V 以列为单位选 za,打开或关 ...
- vue-cli打包后图片路径取不到的问题
今天准备把vue-cli build 的文件发到服务器上单发现会出现图片找不到的问题 解决办法如下 修改 assetsPublicPath: './' .打开webpack.prod.conf.js, ...
- Java设计模式_创建型模式_单例模式
单例模式的实现: 定义一个类,在类中定义该类的静态变量,再定一个一个获取该类的静态变量的方法. UML图: