Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import sys
- from amqplib import client_0_8 as amqp
- # Modelling a global chat publisher
- class Chat:
- GLOBAL_EXCHANGE = "global_chat"
- PRIVATE_EXCHANGE = "private_chat"
- GLOBAL_ROUTING_KEY = "global_message"
- def __init__(self, username):
- self.conn = amqp.Connection(host="192.168.24.131:5672 ", userid="guest", password="guest", virtual_host="/", insist=False)
- self.chan = self.conn.channel()
- self.username = username
- self.GLOBAL_QUEUE = "global_chat_%s" % self.username
- self.PRIVATE_QUEUE = "user_%s" % self.username
- self.PRIVATE_ROUTING_KEY = "private_%s"
- self.declare_amqp_components()
- def declare_amqp_components(self):
- # Declare the single chat exchange
- self.chan.exchange_declare(exchange=self.GLOBAL_EXCHANGE, type="fanout", durable=True, auto_delete=False)
- self.chan.exchange_declare(exchange=self.PRIVATE_EXCHANGE, type="direct", durable=True, auto_delete=False)
- # Declare 2 queues: one global, and one private for the user
- self.chan.queue_declare(queue=self.GLOBAL_QUEUE, durable=True, exclusive=False, auto_delete=False)
- self.chan.queue_declare(queue="user_%s" % self.username, durable=True, exclusive=False, auto_delete=False)
- # Bind both queues to the chat exchange, with different routing keys
- self.chan.queue_bind(queue=self.GLOBAL_QUEUE, exchange=self.GLOBAL_EXCHANGE, routing_key=self.GLOBAL_ROUTING_KEY)
- self.chan.queue_bind(queue=self.PRIVATE_QUEUE, exchange=self.PRIVATE_EXCHANGE, routing_key=self.PRIVATE_ROUTING_KEY % self.username)
- def shout(self, message):
- msg = amqp.Message(message)
- msg.properties["delivery_mode"] = 2 # Persistent
- self.chan.basic_publish(msg, exchange=self.GLOBAL_EXCHANGE, routing_key=self.GLOBAL_ROUTING_KEY)
- def whisper(self, target_username, message):
- msg = amqp.Message(message)
- msg.properties["delivery_mode"] = 2 # Persistent
- self.chan.basic_publish(msg, exchange=self.PRIVATE_EXCHANGE, routing_key=self.PRIVATE_ROUTING_KEY % target_username)
- def listen(self):
- self.chan.basic_consume(queue=self.GLOBAL_QUEUE, no_ack=True, callback=self._receive_global_message, consumer_tag="global_chat_receiver")
- self.chan.basic_consume(queue=self.PRIVATE_QUEUE, no_ack=True, callback=self._receive_private_message, consumer_tag="private_chat_receiver")
- while True:
- self.chan.wait()
- self.chan.basic_cancel("chat_receiver")
- def _receive_global_message(self, message):
- print "<SHOUT>: %s" % message.body
- def _receive_private_message(self, message):
- print "<PRIVATE>: %s" % message.body
- # Command line client/listener
- if len(sys.argv) < 2:
- print "Usage: "
- print " python chat_client.py <your_username> whisper <target_username> \"Psst, keep this a secret!\""
- print " python chat_client.py <your_username> shout \"Hey everybody!\""
- sys.exit(0)
- user, command = sys.argv[1], sys.argv[2]
- g = Chat(user)
- if command == "listen":
- g.listen()
- if command == "shout":
- g.shout(message=sys.argv[3])
- if command == "whisper":
- g.whisper(target_username=sys.argv[3], message=sys.argv[4])
Add Comment
Please, Sign In to add comment