ZeroMQ是一個消息隊列網絡庫,實現網絡常用技術封裝。在C/S中實現了三種模式,這段時間用python簡單實現了一下,感覺python雖然靈活。但是數據處理不如C++自由靈活。
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") 9 socket.setsockopt(zmq.SUBSCRIBE,'') 10 while True: 11 print socket.recv()
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)
消息結構:
在每個消息buff前均會自帶一個buff長度