Reference: http://blog.csdn.net/kwsy2008/article/details/49464663

本篇博客将介绍zmq应答模式,所谓应答模式,就是一问一答,规则有这么几条

1、 必须先提问,后回答

2、 对于一个提问,只能回答一次

3、 在没有收到回答前不能再次提问

上代码,服务端:

  1. #coding=utf-8
  2. '''''
  3. Created on 2015-10-10
  4. 回复请求
  5. @author: kwsy2015
  6. '''
  7. import zmq
  8. import time
  9. context = zmq.Context()
  10. socket = context.socket(zmq.REP)
  11. socket.bind('tcp://*:5555')
  12. while True:
  13. message = socket.recv()
  14. print 'received request: ' ,message
  15. time.sleep(1)
  16. socket.send('World')

客户端:

  1. #coding=utf-8
  2. '''''
  3. Created on 2015-10-10
  4. 你无法连续向服务器发送数据,必须发送一次,接收一次
  5. REQ和REP模式中,客户端必须先发起请求
  6. @author: kwsy2015
  7. '''
  8. import zmq
  9. context = zmq.Context()
  10. print 'connect to hello world server'
  11. socket =  context.socket(zmq.REQ)
  12. socket.connect('tcp://localhost:5555')
  13. for request in range(1,10):
  14. print 'send ',request,'...'
  15. socket.send('hello')
  16. message = socket.recv()
  17. print 'received reply ',request,'[',message,']'

为了满足条件1,所以,客户端必须先接收问题,客户端总是必须先提问,客户端提问后,必须等待回答,在收到回答前如果又发出提问,那么会报错。

zmq.REP是应答方,zmq.REQ是提问方,显然,我们可以有多个提问方,但只能有一个提问方,这就好比正在学生正在上课,只能有一个老师来回答问题,可以有多个学生提问,老师只能一个问题一个问题的来回答,所以喽,必须是学生先提问,老师来回答,然后回答下一个学生的提问。

自问自答环节:

问题1: 应答方和提问方谁先启动呢?(服务端和客户端谁先启动呢?)

答: 谁先启动都可以,和pub/sub模式一样

问题2: 如果服务端断掉或者客户端断掉会产生怎样的影响?

答:  如果是客户端断掉,对服务端没有任何影响,如果客户端随后又重新启动,那么两方继续一问一答,但是如果是服务端断掉了,就可能会产生一些问题,这要看服务端是在什么情况下断掉的,如果服务端收是在回答完问题后断掉的,那么没影响,重启服务端后,双发继续一问一答,但如果服务端是在收到问题后断掉了,还没来得及回答问题,这就有问题了,那个提问的客户端迟迟得不到答案,就会一直等待答案,因此不会再发送新的提问,服务端重启后,客户端迟迟不发问题,所以也就一直等待提问。

问题3: 看代码,服务端根本就没去区分提问者是谁,如果有两个提问题的人,如何保证服务端的答案准确的发给那个提问的客户端呢?

答:  关于这一点,大家不必担心,zmq的内部机制已经做了保证,提问者必然只收到属于自己的答案,我们不必去操心zmq是怎么做到的,你只需关于业务本身即可。

现在,我们把服务端代码做修改

  1. #coding=utf-8
  2. '''''
  3. Created on 2015-10-15
  4. @author: kwsy2015
  5. '''
  6. import zmq
  7. import time
  8. context = zmq.Context()
  9. socket = context.socket(zmq.REP)
  10. socket.bind('tcp://*:5555')
  11. while True:
  12. message = socket.recv()
  13. print 'received request: ' ,message
  14. time.sleep(1)
  15. if message == 'hello':
  16. socket.send('World')
  17. else:
  18. socket.send('success')

写两个客户端

客户端1:

  1. #coding=utf-8
  2. '''''
  3. Created on 2015-10-15
  4. @author: kwsy2015
  5. '''
  6. import zmq
  7. context = zmq.Context()
  8. print 'connect to hello world server'
  9. socket =  context.socket(zmq.REQ)
  10. socket.connect('tcp://localhost:5555')
  11. for request in range(1,10):
  12. print 'send ',request,'...'
  13. socket.send('hello')
  14. message = socket.recv()
  15. print 'received reply ',request,'[',message,']'

客户端2:

  1. #coding=utf-8
  2. '''''
  3. Created on 2015-10-15
  4. @author: kwsy2015
  5. '''
  6. import zmq
  7. context = zmq.Context()
  8. print 'connect to hello world server'
  9. socket =  context.socket(zmq.REQ)
  10. socket.connect('tcp://localhost:5555')
  11. for request in range(1,10):
  12. print 'send ',request,'...'
  13. socket.send('ok')
  14. message = socket.recv()
  15. print 'received reply ',request,'[',message,']'

实际的运行结果如图:

不难看出,每个客户端都收到了只属于自己的答案

python zeromq 使用的更多相关文章

  1. 网络编程之python zeromq学习系列之一

    简介: zeromq中间件,他是一个轻量级的消息中间件,传说是世界上最快的消息中间件,为什么这么说呢? 因为一般的消息中间件都需要启动消息服务器,但是zeromq这厮尽然没有消息服务器,他压根没有消息 ...

  2. linux 下 rpc python 实例之使用XML-RPC进行远程文件共享

    这是个不错的练习,使用python开发P2P程序,或许通过这个我们可以自己搞出来一个P2P下载工具,类似于迅雷.XML-RPC是一个远程过程调用(remote procedure call,RPC)的 ...

  3. saltstack高效运维

    saltstack高效运维   salt介绍 saltstack是由thomas Hatch于2011年创建的一个开源项目,设计初衷是为了实现一个快速的远程执行系统. salt强大吗 系统管理员日常会 ...

  4. lunix salt 用法

    红蜘蛛软件 c/s client  : 学生端是客户端 ,装了红蜘蛛客户端-学生端 server端: 教师机  ,装了红蜘蛛软件-教师端  教师机,只能管理,  教师机和学生机,相互通信,相互知道的情 ...

  5. linux之master和minion

    saltstack博客地址: https://www.cnblogs.com/pyyu/p/9465608.html在线yaml文件编写:http://www.bejson.com/validator ...

  6. 使用XML-RPC进行远程文件共享

    这是个不错的练习,使用python开发P2P程序,或许通过这个我们可以自己搞出来一个P2P下载工具,类似于迅雷.XML-RPC是一个远程过程调用(remote procedure call,RPC)的 ...

  7. slatstack高效运维

    一.简介 saltstack是由thomas Hatch于2011年创建的一个开源项目,设计初衷是为了实现一个快速的远程执行系统. 二.诞生的背景 系统管理员日常会进行大量的重复性操作,例如安装软件, ...

  8. 自动化运维之saltstack的使用安装

    SaltStack 简介 SaltStack是一个服务器基础架构集中化管理平台,具备配置管理.远程执行.监控等功能,基于Python语言实现,结合轻量级消息队列(ZeroMQ)与Python第三方模块 ...

  9. saltstack系列(二)——zmq应答模式

    python zeromq介绍 1.ZeroMQ并不是一个对socket的封装,不能用它去实现已有的网络协议. 2.有自己的模式,不同于更底层的点对点通讯模式. 3.有比tcp协议更高一级的协议(当然 ...

随机推荐

  1. Install MySQL 5.7 on Fedora 25/24, CentOS/RHEL 7.3/6.8/5.11

    MySQL is a relational database management system (RDBMS) that runs as a server providing multi-user ...

  2. VI 基本可视模式

    可视模式让你可以选择文件的一部分内容,以便作比如删除,复制等工作. 进入可视模式 v 用v命令进入可视模式.当光标移动时,就能看到有一些文本被高亮显示了,它们就是被选中的内容. 三种可视模式 v 一个 ...

  3. STDIN_FILENO的作用及与stdin 的区别

    1.STDIN_FILENO的作用 STDIN_FILENO属于系统API接口库,其声明为 int 型,是一个打开文件句柄,对应的函数主要包括 open/read/write/close 等系统级调用 ...

  4. [Android实例] Android之断点续传下载

    在我们做开发的时候经常遇到的就是下载了,现在下载的方法有很多很多,那么怎么做到断点续传下载呢!很多人都头疼这个问题,如果我们没有很好的逻辑真不是很容易解决啊.我参考了一下前辈们的资料了整理了一个项目, ...

  5. 【Spring】SpringMVC中浅析数据的传递方式

    包括了基本数据类型的传递和 Date数据类型的传递.关于SpringMVC的配置可以参见基于注解实现SpringMVC+MySQL 假设有表单页面如下: <h1>登录</h1> ...

  6. MVC图片上传详解 IIS (安装SSL证书后) 实现 HTTP 自动跳转到 HTTPS C#中Enum用法小结 表达式目录树 “村长”教你测试用例 引用provinces.js的三级联动

    MVC图片上传详解   MVC图片上传--控制器方法 新建一个控制器命名为File,定义一个Img方法 [HttpPost]public ActionResult Img(HttpPostedFile ...

  7. numpy.linspace()等差数列函数

    在numpy中的linspace()函数类似与arange().range()函数: arange() .range() 可以通过指定开始值.终值和步长创建一维等差数组,但其数组中不包含终值 通过   ...

  8. 安卓7.0遇到 android.os.FileUriExposedException: file:///storage/emulated.. exposed beyond app through Intent.getData()

    1.在AndroidManifest.xml中添加如下代码 <?xml version="1.0" encoding="utf-8"?> <m ...

  9. linux记录sftp命令

    使用以下配置方法不需要配置chroot. 编辑sshd_config文件 vi /etc/ssh/sshd_config 增加: Subsystem sftp /usr/libexec/openssh ...

  10. Java设计模式(八)----代理模式

    代理模式 1.生活中: 代理就是一个人或者一个组织代表其它人去做一件事的现实生活中的. 在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象能够在client和目标对象之间起到中介的作用. ...