2017-08-18 80 views
3

我有一個Python WebSocket服務器。這可以在收到消息時返回響應。從Tornado WebSocket服務器主動發送消息

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

class WebSocketHandler(tornado.websocket.WebSocketHandler): 

    def open(self): 
     print("New client connected") 
     self.write_message("You are connected") 

    def on_message(self, message): 
     self.write_message(u"You said: " + message) 

    def on_close(self): 
     print("Client disconnected") 

    def check_origin(self, origin): 
     return True 

application = tornado.web.Application([ 
     (r"/", WebSocketHandler), 
]) 


if __name__ == "__main__": 
    application.listen(8888) 
    tornado.ioloop.IOLoop.instance().start() 

但是,在收到消息之前,它不能發送消息。我如何積極發送消息?例如,它測量時間,如果它在10秒內沒有收到消息,它會發送「你在睡覺嗎?」。

我想使用WebSocket製作聊天機器人。我使用龍捲風和websocket,因爲我只知道這一點,如果你知道在這方面使用更好的方法,我會感興趣。

回答

0

您可以tornado.ioloop.PeriodicCallback添加日程表,只是檢查是否有活動或不基於時間,如下所示(我適應從您的代碼和this answer):

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

class WebSocketHandler(tornado.websocket.WebSocketHandler): 
    def simple_init(self): 
     self.last = time.time() 
     self.stop = False 

    def open(self): 
     self.simple_init() 
     print("New client connected") 
     self.write_message("You are connected") 
     self.loop = tornado.ioloop.PeriodicCallback(self.check_ten_seconds, 1000, io_loop=tornado.ioloop.IOLoop.instance()) 
     self.loop.start() 

    def on_message(self, message): 
     self.write_message(u"You said: " + message) 
     self.last = time.time() 

    def on_close(self): 
     print("Client disconnected") 
     self.loop.stop() 

    def check_origin(self, origin): 
     return True 

    def check_ten_seconds(self): 
     print("Just checking") 
     if (time.time() - self.last > 10): 
      self.write_message("You sleeping mate?") 
      self.last = time.time() 
與客戶交流

現在怠速和寫作之間(改編自here):

class Client(object): 
    def __init__(self, url, timeout): 
     self.url = url 
     self.timeout = timeout 
     self.ioloop = IOLoop.instance() 
     self.ws = None 
     self.connect() 
     PeriodicCallback(self.keep_alive, 20000, io_loop=self.ioloop).start() 
     self.ioloop.start() 

    @gen.coroutine 
    def connect(self): 
     print("trying to connect") 
     try: 
      self.ws = yield websocket_connect(self.url) 
     except Exception as e: 
      print("connection error") 
     else: 
      print("connected") 
      self.run() 

    @gen.coroutine 
    def run(self): 
     once = False 
     while True: 
      msg = yield self.ws.read_message() 
      print(msg) 
      if once: 
       time.sleep(11) 
       once = False 
      else: 
       time.sleep(1) 
       once = True 
      self.ws.write_message("Hello matey") 
      if msg is None: 
       print("connection closed") 
       self.ws = None 
       break 

    def keep_alive(self): 
     if self.ws is None: 
      self.connect() 
     else: 
      self.ws.write_message("keep alive") 

我們獲得預期輸出:

trying to connect 
connected 
You are connected 
You said: Hello matey 
You sleeping mate? 
You said: Hello matey 
You said: Hello matey 
You sleeping mate? 
相關問題