- Request-Reply: اتصال مجموعه ای از سرویس گیرنده ها به مجموعه ای از سرویس دهنده ها.
- Publish-Subscribe: اتصال مجموعه ای از توزیع کنندگان به مجموعه ای از دریافت کنندگان. این یک مدل توزیع داده است.
- Push-pull: یک مدل fan out/fan in که در این مدل یک صف پیغام به تمام دریافت کنندگان پوش میشود.
- exclusive pair: اتصال دو سوکت به همدیگر به صورت جفت خاص
- سیستم A دارای یک پردازش که به پورت 5556 گوش میدهد و خود سیستم دارای آدرس 192.168.10.245 است.
import zmq import time import sys port = "5556" if len(sys.argv) > 1: port = sys.argv[1] int(port) context = zmq.Context() socket = context.socket(zmq.REP) socket.bind("tcp://*:%s" % port) while True: # Wait for next request from client message = socket.recv() print "Received request: ", message time.sleep (1) socket.send("World from %s" % port)
- سیستم B که به سیستم A متصل خواهد شد.
import zmq from zmq import ssh import sys import paramiko port = "5557" if len(sys.argv) > 1: port = sys.argv[1] int(port) if len(sys.argv) > 2: port1 = sys.argv[2] int(port1) context = zmq.Context() print "Connecting to server..." socket = context.socket(zmq.REQ) socket.connect ("tcp://192.168.10.245:%s" % port) # Do 10 requests, waiting each time for a response for request in range (1,10): print "Sending request ", request,"..." socket.send ("Hello") # Get the reply. message = socket.recv() print "Received reply ", request, "[", message, "]"این سیستم میتواند به سادگی توسط zmq پیاده سازی شود.
ssh -L 127.0.0.1:5557:localhost:5556 user@192.168.10.245 -N
بعد از وارد کردن دستور بالا در ترمینال کلمه عبور سیستم A پرسیده میشود. بعد از وارد کردن آن میتون ارتباط امن بین پردازش ها را داشته باشیم. کد برنامه ها به صورت زیر تغییر پیدا میکند:
سیستم A که نقش سرور را دارد:
import zmq import time import sys port = "5556" if len(sys.argv) > 1: port = sys.argv[1] int(port) context = zmq.Context() socket = context.socket(zmq.REP) socket.bind("tcp://127.0.0.1:%s" % port) while True: # Wait for next request from client message = socket.recv() print "Received request: ", message time.sleep (1) socket.send("World from %s" % port)
کد سیستم B که نقش سرویس گیرنده دارد:
import zmq from zmq import ssh import sys import paramiko port = "5557" if len(sys.argv) > 1: port = sys.argv[1] int(port) if len(sys.argv) > 2: port1 = sys.argv[2] int(port1) context = zmq.Context() print "Connecting to server..." socket = context.socket(zmq.REQ) socket.connect ("tcp://127.0.0.1:%s" % port) # Do 10 requests, waiting each time for a response for request in range (1,10): print "Sending request ", request,"..." socket.send ("Hello") # Get the reply. message = socket.recv() print "Received reply ", request, "[", message, "]"
در کتابخانه pyzmq که یک پیاده سازی برای zmq است، یک گسترش بر روی اتصال zmq وجود دارد که همین کار اتصال تونل را انجام میدهد. کد نهایی به صورت زیر خواهد بود:
کد سیستم A تغییر نخواهد کرد و همان کد قسمت قبلی است
کد سیستم B به صورت زیر خواهد بود:
import zmq from zmq import ssh import sys import paramiko port = "5557" if len(sys.argv) > 1: port = sys.argv[1] int(port) if len(sys.argv) > 2: port1 = sys.argv[2] int(port1) context = zmq.Context() print "Connecting to server..." socket = context.socket(zmq.REQ) ssh.tunnel_connection(socket,"tcp://127.0.0.1:5556","user@192.168.10.245",password="111111") if len(sys.argv) > 2: socket.connect ("tcp://192.168.10.245:%s" % port1) # Do 10 requests, waiting each time for a response for request in range (1,10): print "Sending request ", request,"..." socket.send ("Hello") # Get the reply. message = socket.recv() print "Received reply ", request, "[", message, "]"