龙卷风websocket异步背景任务

时间:2016-05-12 07:54:12

标签: python websocket tornado

我尝试创建一个龙卷风websocket,它位于后台。 处理来自另一个设备的输入事件。

Usecase:使用android app中的websocket连接控制raspberry pi。

我可以使用以下实现创建连接:

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)

连接处理程序:

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)

连接:

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)
main.py文件中的

是在创建websocket之后的函数,并且从不调用此函数。我猜这是龙卷风的异步链问题。

有什么建议吗? 提前致谢。

1 个答案:

答案 0 :(得分:0)

我想出了一种方法,但我不确定这是否正确。无论如何,在这个设置中它起作用:

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)

你可以看到我在调用核心函数后在主文件中启动循环。这样就可以了。

但正如我之前所说,我不确定这是否真的正确。