2016-05-12 14 views
1

Ich versuche, einen Tornado Websocket zu erstellen, der im Hintergrund ist. um Ereignisse von Eingaben von einem anderen Gerät zu behandeln.Tornado Websocket async Hintergrundaufgabe

Usecase: Steuern Sie die Raspberry Pi mit einer Websocket-Verbindung von Android App.

i bin in der Lage, eine Verbindung mit der folgenden implemtation zu erstellen:

main.py:

import sys 

from sys import stdin 
from websocket import connection 


def main(args): 
    print "start application" 
    port = 7004 
    if args[0] != port: 
     port = args[0] 

    connection.WebSocketConnection(port) 
    core() 


def core(): 
    run = True 

    while run: 
     userinput = stdin.readline() 
     print userinput 

     if userinput == 'quit': 
      print "quit app" 
      sys.exit() 

if __name__ == "__main__": 
    main(sys.argv) 

Verbindungs-Handler:

import tornado.web 
import message.MessageHandler 

from message.messageConstructor import MessageConstructor 
from tornado.web import asynchronous 


class WebSocketHandler(tornado.websocket.WebSocketHandler): 
    def open(self): 
     print 'new connection' 
     self.send(message.MessageHandler.serialize(MessageConstructor('Engine1', '100'))) 

    def on_message(self, rawMessage): 
     print rawMessage 
     obj = message.MessageHandler.deserialize(rawMessage) 
     print(obj.target) 

    def on_close(self): 
     print 'connection closed' 

    def check_origin(self, origin): 
     return True 

    def send(self, message): 
     self.write_message(message) 

Verbindung:

import tornado.httpserver 
import tornado.websocket 
import tornado.ioloop 
import tornado.web 
import socket 

from websocket import connectionHandler 


class WebSocketConnection(): 
    def __init__(self, port): 
     self.socketHandler = connectionHandler.WebSocketHandler 

     application = tornado.web.Application([ 
      (r'/', self.socketHandler), 
     ]) 

     http_server = tornado.httpserver.HTTPServer(application) 
     http_server.listen(7004) 
     myIP = socket.gethostbyname(socket.gethostname()) 
     print '*** Websocket Server Started at %s***' % myIP 
     tornado.ioloop.IOLoop.instance().start() 

    def send(self, message): 
     self.socketHandler.send(message) 

ich Die main.py-Datei ist eine Funktion nach der Websocket-Erstellung und diese Funktion wird nie aufgerufen. Ich denke, es ist ein Problem mit der asynchronen Tornado-Kette.

Irgendwelche Vorschläge? Vielen Dank im Voraus.

Antwort

0

Ich habe einen Weg gefunden, das zu tun, aber ich bin mir nicht sicher, ob das der richtige Weg ist. Auf jeden Fall in dieser Reihe bis es funktioniert:

main.py:

import sys 

from sys import stdin 
from websocket import connection 
from tornado.ioloop import IOLoop 


def main(args): 
    print "start application" 
    port = 7004 
    if args[0] != port: 
     port = args[0] 

    connection.WebSocketConnection(port) 
    core() 

    IOLoop.instance().start() 


def core(): 
    run = True 

    while run: 
     userinput = stdin.readline() 
     print userinput 

     if userinput == 'quit': 
      print "quit app" 
      sys.exit() 

if __name__ == "__main__": 
    main(sys.argv) 

connection.py:

import tornado.httpserver 
import tornado.websocket 
import tornado.ioloop 
import tornado.web 
import socket 

from websocket import connectionHandler 


class WebSocketConnection(): 
    def __init__(self, port): 
     self.socketHandler = connectionHandler.WebSocketHandler 

     application = tornado.web.Application([ 
      (r'/', self.socketHandler), 
     ]) 

     http_server = tornado.httpserver.HTTPServer(application) 
     http_server.listen(7004) 
     myIP = socket.gethostbyname(socket.gethostname()) 
     print '*** Websocket Server Started at %s***' % myIP 

    def send(self, message): 
     self.socketHandler.send(message) 

wie man sehen kann ich die Schleife nur in der Hauptdatei starten, nachdem der Aufruf Hauptfunktion. Auf diese Weise funktioniert es.

aber wie ich schon sagte ich bin mir nicht sicher, ob das wirklich richtig ist.

Verwandte Themen