ZeroMQ是一個消息隊(duì)列網(wǎng)絡(luò)庫,實(shí)現(xiàn)網(wǎng)絡(luò)常用技術(shù)封裝。在C/S中實(shí)現(xiàn)了三種模式,這段時間用python簡單實(shí)現(xiàn)了一下,感覺python雖然靈活。但是數(shù)據(jù)處理不如C++自由靈活。
1.Request-Reply模式:
客戶端在請求后,服務(wù)端必須回響應(yīng)
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 message13 #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,沒有隊(duì)列緩存,斷開連接數(shù)據(jù)將永遠(yuǎn)丟失。client可以進(jìn)行數(shù)據(jù)過濾。
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進(jìn)行數(shù)據(jù)推送,work進(jìn)行數(shù)據(jù)緩存,pull進(jìn)行數(shù)據(jù)競爭獲取處理。區(qū)別于Publish-Subscribe存在一個數(shù)據(jù)緩存和處理負(fù)載。
當(dāng)連接被斷開,數(shù)據(jù)不會丟失,重連后數(shù)據(jù)繼續(xù)發(fā)送到對端。
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)
消息結(jié)構(gòu):
在每個消息buff前均會自帶一個buff長度