Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Keeping a list of websocket connections in Tornado [duplicate]

I figured to keep track of multiple websocket connections I have to store the WebSocket Handler objects in a list. But I have multiple handlers - one for each WS URI (endpoint). Lets say my project has three end points - A, B, C

ws://www.example.com/A
ws://www.example.com/B
ws://www.example.com/C

So to handle connections for each of these, I have three handlers. So I am puzzled about where to create the list to store the handler objects to be used later.

My code before adding the list is --

class WSHandlerA(tornado.websocket.WebSocketHandler):
    def open(self):
        print 'new connection'
        self.write_message("Hello World")

    def on_message(self, message):
        print 'message received %s' % message

    def on_close(self):
        print 'connection closed'


class WSHandlerB(tornado.websocket.WebSocketHandler):
    def open(self):
        print 'new connection'
        self.write_message("Hello World")

    def on_message(self, message):
        print 'message received %s' % message

    def on_close(self):
        print 'connection closed'

class WSHandlerC(tornado.websocket.WebSocketHandler):
    def open(self):
        print 'new connection'
        self.write_message("Hello World")

    def on_message(self, message):
        print 'message received %s' % message

    def on_close(self):
        print 'connection closed'

application = tornado.web.Application([
    (r'/A', WSHandlerA),
    (r'/B', WSHandlerB),
    (r'/C', WSHandlerC),
])


if __name__ == "__main__":
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

So where do I create this list and make sure it's visible to all the objects created? I am new to python as well and so having a little trouble wrapping my head around it.

I also realize I could probably use just one URI (endpoint) and send the multiple commands as part of the message itself. But then I don't want to turn WebSocket into a binary protocol. Given that we have URIs I should be using them.

Thanks for any help.

like image 956
user220201 Avatar asked Oct 17 '25 22:10

user220201


1 Answers

It depends what you want to do with the handlers, but you could easily make them accessible in three lists:

# Global variables.
a_handlers = []
b_handlers = []
c_handlers = []

WSHandlerA.open() does a_handlers.append(self), and WSHandlerB.open() does b_handlers.append(self), and so on. WSHandlerA.on_close() does a_handlers.remove(self).

If you want to do something with all A handlers:

for handler in a_handlers:
    handler.write_message("message on A")

To do something with all handlers:

for handler in a_handlers + b_handlers + c_handlers:
    # do something....
    pass

By the way, if you use a Python set() instead of a list for each set of handlers it'll be a little better. With sets instead of lists, use add and discard instead of append and remove.

like image 154
A. Jesse Jiryu Davis Avatar answered Oct 20 '25 12:10

A. Jesse Jiryu Davis



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!