Guest User

Untitled

a guest
May 24th, 2018
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.19 KB | None | 0 0
  1. import sys
  2. from amqplib import client_0_8 as amqp
  3.  
  4. # Modelling a global chat publisher
  5. class Chat:
  6.  
  7. GLOBAL_EXCHANGE = "global_chat"
  8. PRIVATE_EXCHANGE = "private_chat"
  9. GLOBAL_ROUTING_KEY = "global_message"
  10.  
  11. def __init__(self, username):
  12. self.conn = amqp.Connection(host="192.168.24.131:5672 ", userid="guest", password="guest", virtual_host="/", insist=False)
  13. self.chan = self.conn.channel()
  14. self.username = username
  15. self.GLOBAL_QUEUE = "global_chat_%s" % self.username
  16. self.PRIVATE_QUEUE = "user_%s" % self.username
  17. self.PRIVATE_ROUTING_KEY = "private_%s"
  18. self.declare_amqp_components()
  19.  
  20. def declare_amqp_components(self):
  21. # Declare the single chat exchange
  22. self.chan.exchange_declare(exchange=self.GLOBAL_EXCHANGE, type="fanout", durable=True, auto_delete=False)
  23. self.chan.exchange_declare(exchange=self.PRIVATE_EXCHANGE, type="direct", durable=True, auto_delete=False)
  24.  
  25. # Declare 2 queues: one global, and one private for the user
  26. self.chan.queue_declare(queue=self.GLOBAL_QUEUE, durable=True, exclusive=False, auto_delete=False)
  27. self.chan.queue_declare(queue="user_%s" % self.username, durable=True, exclusive=False, auto_delete=False)
  28.  
  29. # Bind both queues to the chat exchange, with different routing keys
  30. self.chan.queue_bind(queue=self.GLOBAL_QUEUE, exchange=self.GLOBAL_EXCHANGE, routing_key=self.GLOBAL_ROUTING_KEY)
  31. self.chan.queue_bind(queue=self.PRIVATE_QUEUE, exchange=self.PRIVATE_EXCHANGE, routing_key=self.PRIVATE_ROUTING_KEY % self.username)
  32.  
  33. def shout(self, message):
  34. msg = amqp.Message(message)
  35. msg.properties["delivery_mode"] = 2 # Persistent
  36. self.chan.basic_publish(msg, exchange=self.GLOBAL_EXCHANGE, routing_key=self.GLOBAL_ROUTING_KEY)
  37.  
  38. def whisper(self, target_username, message):
  39. msg = amqp.Message(message)
  40. msg.properties["delivery_mode"] = 2 # Persistent
  41. self.chan.basic_publish(msg, exchange=self.PRIVATE_EXCHANGE, routing_key=self.PRIVATE_ROUTING_KEY % target_username)
  42.  
  43. def listen(self):
  44. self.chan.basic_consume(queue=self.GLOBAL_QUEUE, no_ack=True, callback=self._receive_global_message, consumer_tag="global_chat_receiver")
  45. self.chan.basic_consume(queue=self.PRIVATE_QUEUE, no_ack=True, callback=self._receive_private_message, consumer_tag="private_chat_receiver")
  46. while True:
  47. self.chan.wait()
  48. self.chan.basic_cancel("chat_receiver")
  49.  
  50. def _receive_global_message(self, message):
  51. print "<SHOUT>: %s" % message.body
  52.  
  53. def _receive_private_message(self, message):
  54. print "<PRIVATE>: %s" % message.body
  55.  
  56.  
  57. # Command line client/listener
  58.  
  59. if len(sys.argv) < 2:
  60. print "Usage: "
  61. print " python chat_client.py <your_username> whisper <target_username> \"Psst, keep this a secret!\""
  62. print " python chat_client.py <your_username> shout \"Hey everybody!\""
  63. sys.exit(0)
  64.  
  65. user, command = sys.argv[1], sys.argv[2]
  66.  
  67. g = Chat(user)
  68. if command == "listen":
  69. g.listen()
  70.  
  71. if command == "shout":
  72. g.shout(message=sys.argv[3])
  73.  
  74. if command == "whisper":
  75. g.whisper(target_username=sys.argv[3], message=sys.argv[4])
Add Comment
Please, Sign In to add comment