Reference: http://blog.csdn.net/kwsy2008/article/details/49464663
本篇博客將介紹zmq應答模式,所謂應答模式,就是一問一答,規則有這么幾條
1、 必須先提問,后回答
2、 對於一個提問,只能回答一次
3、 在沒有收到回答前不能再次提問
上代碼,服務端:
- #coding=utf-8
- '''''
- Created on 2015-10-10
- 回復請求
- @author: kwsy2015
- '''
- import zmq
- import time
- context = zmq.Context()
- socket = context.socket(zmq.REP)
- socket.bind('tcp://*:5555')
- while True:
- message = socket.recv()
- print 'received request: ' ,message
- time.sleep(1)
- socket.send('World')
客戶端:
- #coding=utf-8
- '''''
- Created on 2015-10-10
- 你無法連續向服務器發送數據,必須發送一次,接收一次
- REQ和REP模式中,客戶端必須先發起請求
- @author: kwsy2015
- '''
- import zmq
- context = zmq.Context()
- print 'connect to hello world server'
- socket = context.socket(zmq.REQ)
- socket.connect('tcp://localhost:5555')
- for request in range(1,10):
- print 'send ',request,'...'
- socket.send('hello')
- message = socket.recv()
- print 'received reply ',request,'[',message,']'
為了滿足條件1,所以,客戶端必須先接收問題,客戶端總是必須先提問,客戶端提問后,必須等待回答,在收到回答前如果又發出提問,那么會報錯。
zmq.REP是應答方,zmq.REQ是提問方,顯然,我們可以有多個提問方,但只能有一個提問方,這就好比正在學生正在上課,只能有一個老師來回答問題,可以有多個學生提問,老師只能一個問題一個問題的來回答,所以嘍,必須是學生先提問,老師來回答,然后回答下一個學生的提問。
自問自答環節:
問題1: 應答方和提問方誰先啟動呢?(服務端和客戶端誰先啟動呢?)
答: 誰先啟動都可以,和pub/sub模式一樣
問題2: 如果服務端斷掉或者客戶端斷掉會產生怎樣的影響?
答: 如果是客戶端斷掉,對服務端沒有任何影響,如果客戶端隨后又重新啟動,那么兩方繼續一問一答,但是如果是服務端斷掉了,就可能會產生一些問題,這要看服務端是在什么情況下斷掉的,如果服務端收是在回答完問題后斷掉的,那么沒影響,重啟服務端后,雙發繼續一問一答,但如果服務端是在收到問題后斷掉了,還沒來得及回答問題,這就有問題了,那個提問的客戶端遲遲得不到答案,就會一直等待答案,因此不會再發送新的提問,服務端重啟后,客戶端遲遲不發問題,所以也就一直等待提問。
問題3: 看代碼,服務端根本就沒去區分提問者是誰,如果有兩個提問題的人,如何保證服務端的答案准確的發給那個提問的客戶端呢?
答: 關於這一點,大家不必擔心,zmq的內部機制已經做了保證,提問者必然只收到屬於自己的答案,我們不必去操心zmq是怎么做到的,你只需關於業務本身即可。
現在,我們把服務端代碼做修改
- #coding=utf-8
- '''''
- Created on 2015-10-15
- @author: kwsy2015
- '''
- import zmq
- import time
- context = zmq.Context()
- socket = context.socket(zmq.REP)
- socket.bind('tcp://*:5555')
- while True:
- message = socket.recv()
- print 'received request: ' ,message
- time.sleep(1)
- if message == 'hello':
- socket.send('World')
- else:
- socket.send('success')
寫兩個客戶端
客戶端1:
- #coding=utf-8
- '''''
- Created on 2015-10-15
- @author: kwsy2015
- '''
- import zmq
- context = zmq.Context()
- print 'connect to hello world server'
- socket = context.socket(zmq.REQ)
- socket.connect('tcp://localhost:5555')
- for request in range(1,10):
- print 'send ',request,'...'
- socket.send('hello')
- message = socket.recv()
- print 'received reply ',request,'[',message,']'
客戶端2:
- #coding=utf-8
- '''''
- Created on 2015-10-15
- @author: kwsy2015
- '''
- import zmq
- context = zmq.Context()
- print 'connect to hello world server'
- socket = context.socket(zmq.REQ)
- socket.connect('tcp://localhost:5555')
- for request in range(1,10):
- print 'send ',request,'...'
- socket.send('ok')
- message = socket.recv()
- print 'received reply ',request,'[',message,']'
實際的運行結果如圖:
不難看出,每個客戶端都收到了只屬於自己的答案