python与zmq系列(3)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://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, ']'

          实际的运行结果如图:


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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值