Esempio n. 1
0
class ChatHandler(WebSocketHandler):
    def __init__(self, *args, **kwargs):
        super(ChatHandler, self).__init__(*args, **kwargs)
        self.listen()

    @tornado.gen.engine
    def listen(self):
        self.redis_client = Redis()
        self.redis_client.connect()
        yield tornado.gen.Task(self.redis_client.subscribe, 'test_channel')
        self.redis_client.subscribed = True
        self.redis_client.listen(self.on_messages_published)

    def open(self):
        logging.info("on new cline")

    def on_messages_published(self, message):
        if not isinstance(message, unicode):
            if isinstance(message, tornadoredis.exceptions.RequestError):
                self.write_message(message.message)
            else:
                if message.kind == "subscribe":
                    self.write_message("进入%s号房间" % (str(message.channel)))
                if message.kind == 'message':
                    self.write_message(str(message.body))
                if message.kind == 'disconnect':
                    # Do not try to reconnect, just send a message back
                    # to the client and close the client connection
                    self.write_message('The connection terminated '
                                       'due to a Redis server error.')
                    self.close()

    def on_message(self, message):
        logging.info('Received new message %r', message)
        try:
            # Convert to JSON-literal.
            message_encoded = tornado.escape.json_encode(message)
            # Persistently store message in Redis.
            # Publish message in Redis channel.
            redis = Redis()
            redis.publish('test_channel',message_encoded)
            self.write_message(message_encoded)
        except Exception, err:
            e = str(sys.exc_info()[0])
            # Send an error back to client.
            self.write_message({'error': 1, 'textStatus': 'Error writing to database: ' + str(err)})
            return

        # Send message through the socket to indicate a successful operation.
        self.write_message(message)
        return