Tornado Websocket

时间:2016-03-01 14:21:08

标签: python websocket tornado

我正在尝试使用Tornado websocket构建实时服务器统计信息。这是我的python脚本

#!/usr/bin/python
.
.(imports)
.


# create logger
# set up logging to file - see previous section for more details
logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
                    datefmt='%m-%d %H:%M',
                    filename='/var/www/home/storage/app/logs/tornado.log',
                    filemode='w')
    formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')

logger = logging.getLogger('realtime.py')

timeInterval= 2000 #Milliseconds

class WSHandler(tornado.websocket.WebSocketHandler):
    def getCpuTemp( self ):
       .
       .


    def getCpuUsage( self ):
       .
       .


    def getRamUsage( self ):
       .
       .


    def lr_temp(self):
       .
       .

    def open(self):
        logger.info('Connection Open')

        #wss.append(self)

        self.callback = PeriodicCallback(self.sendData, timeInterval)
        self.callback.start()




    def on_message(self, message):
        try:
            msg = json.loads(message)
        except ValueError:
            self.send_error("Invalid JSON")
            logger.info('Invalid JSON')
            return
        #logger.info('message received:  %s' % message)
        logger.info('Message Received , JSON valid')

    def sendData(self):
        self.write_message(self.getCpuTemp() + ';' + self.lr_temp() + ';' + self.getCpuUsage() + ';' + self.getRamUsage())



    def on_close(self):
        logger.info('Connection Closed')


    def check_origin(self, origin):
        return True

application = tornado.web.Application([
    (r'/ws', WSHandler),
])

if __name__ == "__main__":
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(8888)
    myIP = socket.gethostbyname(socket.gethostname())
    #print '*** Websocket Server Started at %s***' % myIP
    tornado.ioloop.IOLoop.instance().start()

启动脚本后一切都很好,但是当我重新填充页面或发送消息时,脚本会进入此错误循环:

03-01 13:49 tornado.application ERROR    Exception in callback <bound method WSHandler.sendData of <__main__.WSHandler object at 0xb644cab0>>
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/tornado/ioloop.py", line 1039, in _run
return self.callback()
File "/var/www/scripts/py/realtime.py", line 110, in sendData
self.write_message(self.getCpuTemp() + ';' + self.lr_temp() + ';' +  self.getCpuUsage() + ';' + self.getRamUsage())
File "/usr/local/lib/python2.7/dist-packages/tornado/websocket.py", line 215, in write_message
raise WebSocketClosedError()
WebSocketClosedError

如何解决此错误?

1 个答案:

答案 0 :(得分:0)

on_close,您需要致电self.callback.stop()。连接关闭时,您可能仍会收到一个错误,但它不会进入循环。要解决该错误,请在write_message的调用周围使用try / catch。