簡體   English   中英

Python Tornado:從另一個類發送 websocket 消息

[英]Python Tornado: Sending websocket messages from another class

有一個使用(Python 3.6)Tkinter & Tornado 的應用程序。 想要在按下按鈕時發送 websocket 消息。

sendSocket 在我的處理接口的類中。 我能夠正常打開我的套接字,並且可以將數據發送到套接字處理程序中。 此外,它可以從我的 RequestHandler 提供我的 html 文件。

我可以看到我的代碼命中了 sendSocketMessage 行。 但是,我從來沒有從 SocketHandler.send_message def 中得到打印。 控制台中沒有錯誤。

    def sendSocketMessage(self, data = "whatever"):
        print("sending")
        #WebSocketeer.send_message(data)        
        ioloop.IOLoop.current().add_callback(WebSocketeer.send_message, data)

class WebSocketeer(websocket.WebSocketHandler):    
    def open(self):
       print("WebSocket opened")

    def on_message(self, message):
       print("got message: " + message)

    def on_close(self):
       print("WebSocket closed")

    @classmethod
    def send_message(self, message):
        print("sending message: " + message)
        for session_id, session in self.session.server._sessions._items.iteritems():
            session.conn.emit(event, message)

基於這些 SO 響應的代碼

在這里找到了一種使其工作的方法: How to run functions outside websocket loop in python (tornado)

但我仍然想知道為什么 add_callback 不起作用 - 因為,從我讀過的內容來看,這是推薦的方式。

這就是我的工作,取自: https : //github.com/tornadoweb/tornado/issues/2802

clients = [];
class WSHandler(tornado.websocket.WebSocketHandler):
    
    def open(self):
        print('connection opened...')
        clients.append(self);

    def on_message(self, message):
        self.write_message("The server says: " + message + " back at you")
        print('received:', message)

    def on_close(self):
        clients.remove(self);
        print('connection closed...')

    @classmethod
    def send_message(self, message):
        print("sending message: " + message)
        for client in clients:
            client.write_message(message);
        #for session_id, session in self.session.server._sessions._items.iteritems():
        #    session.conn.emit(event, message);
        return True;

def sendRandom():
    global thread, data;
    try:
        print("sendRandom()");
        time.sleep(0.125);
        n = random.randint(0,1000);
        data = str(n);
        data = {"msg":"data","data":data};
        if eventLoop is not None:
            #If response needed
                #sendData(eventLoop,WSHandler.send_message,json.dumps(data));
            #else
            eventLoop.add_callback(WSHandler.send_message,json.dumps(data));
    except:
        print("Err");
        traceback.print_exc();

clients = [];

def sendData(loop,f,*a,**kw):
    print("%s %s" % (type(loop),type(f)));
    concurrent_future = concurrent.futures.Future();
    async def wrapper():
        try:
           rslt = f(*a,**kw);
        except Exception as e:
            concurrent_future.set_exception(e);
        else:
            concurrent_future.set_result(rslt);
    loop.add_callback(wrapper);
    return concurrent_future.result();

eventLoop = None;

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

def startServer():
    global eventLoop;
    try:
        print("Starting server @%s:%d" %("localhost",9090));  
        asyncio.set_event_loop(asyncio.new_event_loop());
        eventLoop = tornado.ioloop.IOLoop();
        application.listen(9090)
        eventLoop.start();
    except KeyboardInterrupt:
        print("^C");
    except:
        print("ERR");
        traceback.print_exc();

if __name__ == "__main__":
    thread = Thread(target=startServer,);
    thread.setDaemon(True);
    thread.start();
    time.sleep(5);
    while True:
        sendRandom(); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM