2013-07-04 46 views
10

我试图拼凑一个测试,允许websockets客户端连接到Tornado服务器,我希望Tornado服务器每隔X秒向所有客户端发送一条消息。python龙卷风websockets每X秒如何发送消息?

我这样做的原因是因为wbesockets连接正在悄悄丢弃某处,我想知道websockets服务器发送的周期性“ping”会维持连接。

恐怕这是一个很不好的问题,下面的代码相当混乱。我只是没有将我的头缠绕在Tornado上,并且没有足够的范围来使它工作。

import tornado.httpserver 
import tornado.websocket 
import tornado.ioloop 
import tornado.web 
import tornado.gen 
import time 
from tornado import gen 

class WSHandler(tornado.websocket.WebSocketHandler): 
    def open(self): 
     print 'http://mailapp.crowdwave.com/girlthumb.jpg' 
     self.write_message("http://www.example.com/girlthumb.jpg") 

    def on_message(self, message): 
     print 'Incoming message:', message 
     self.write_message("http://www.example.com/girlthumb.jpg") 


    def on_close(self): 
     print 'Connection was closed...' 

@gen.engine 
def f(): 
    yield gen.Task(tornado.ioloop.IOLoop.instance().add_timeout, time.time() + 8) 
    self.write_message("http://www.example.com/x.png") 
    print 'x' 

@gen.engine 
def g(): 
    yield gen.Task(tornado.ioloop.IOLoop.instance().add_timeout, time.time() + 4) 
    self.write_message("http://www.example.com/y.jpg") 
    print 'y' 

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

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

回答

9

为什么不尝试在里面写一个调度器? :)

def schedule_func(): 
    #DO SOMETHING# 

#milliseconds 
interval_ms = 15 
main_loop = tornado.ioloop.IOLoop.instance() 
sched = tornado.ioloop.PeriodicCallback(schedule_func,interval_ms, io_loop = main_loop) 
#start your period timer 
sched.start() 
#start your loop 
main_loop.start() 
3

发现,该接受的答案是几乎正是我想要的:

How to run functions outside websocket loop in python (tornado)

有轻微的修改,在上面的链接接受的答案不断地向外发送ping消息。这是国防部:

变化:

def test(self): 
    self.write_message("scheduled!") 

到:

def test(self): 
    self.write_message("scheduled!") 
    tornado.ioloop.IOLoop.instance().add_timeout(datetime.timedelta(seconds=5), self.test)