0

I am a newbie in Python. I am now having a project that using a raspberry pi to connect to local web, a web server & a mobile apps via websocket. Both of them are interactive. I can now communicate with each of them separately with 3 different program. But I face some problems when I want to integrate them into 1.

I read a number of post in here & find that all answers suggest to use a list to store each websocket and all of them sending the same message. Is it possible to send different message? Maybe something this

import tornado.ioloop
import tornado.web
import tornado.websocket

class WebSocketHandler_web(tornado.websocket.WebSocketHandler):
    def __init__(self, application, **kwargs):
        pass

    def open(self):
        # do something

    def on_message(self, msg):
        # do something

    def on_close(self):
        # do something

class WebSocketHandler_mobile(tornado.websocket.WebSocketHandler):
    def __init__(self, application, **kwargs):
        pass

    def open(self):
        # do something

    def on_message(self, msg):
        # do something

    def on_close(self):
        # do something

class WebSocketHandler_server(tornado.websocket.WebSocketHandler):
    def __init__(self, application, **kwargs):
        pass

    def open(self):
        # do something

    def on_message(self, msg):
        # do something

    def on_close(self):
        # do something

app_web    = tornado.web.Application([(r'/ws/', WebSocketHandler_web),])
app_mobile = tornado.web.Application([(r'/ws/', WebSocketHandler_mobile),])
app_server = tornado.web.Application([(r'/ws/', WebSocketHandler_server),])

def main_task():
    # do something
    if(mode == 1):
        webSocket_web.write_message("Mode 1")
    elif(mode == 2):
        webSocket_mobile.write_message("Mode 2")
    elif(mode == 3):
        webSocket_server.write_message("Mode 3")
    # do something

if __name__ == "__main__":
    app_web.listen(7777)
    app_mobile.listen(8888)
    app_server.listen(9999)
    webSocket_web    = WebSocketHandler_web(app_web)
    webSocket_mobile = WebSocketHandler_mobile(app_mobile)
    webSocket_server = WebSocketHandler_server(app_server)
    tornado.ioloop.PeriodicCallback(main_task,1000).start()
    tornado.ioloop.IOLoop.instance.start()

But seems that websocket.init needs a parameter request. What is that?

Sin Shu Kei
  • 81
  • 1
  • 1
  • 6
  • Seems that using a list is a must for sending message outside the WebSocketHandler Class https://stackoverflow.com/questions/12479054/how-to-run-functions-outside-websocket-loop-in-python-tornado – Sin Shu Kei Jan 29 '19 at 02:53

1 Answers1

1

Is it possible to send different message Just iterate over a list of stored websockets and send different message, simple as that.

init needs a parameter request Tornado on each incoming request creates an instance of a request handler, and request is passed to init to bind a handler to request. When you override an init method in your handler you should follow parent's method interface. Don't worry about value of request argument, tornado will pass it for you.

Fine
  • 2,114
  • 1
  • 12
  • 18