天天看點

python tornado.websocket伺服器主動給用戶端發消息

import tornado.web
import tornado.websocket
from tornado.ioloop import IOLoop #異步池
from tornado import gen #多線程
import tornado.options #全局顯示指令行
from tornado.concurrent import run_on_executor #同步轉異步
from concurrent.futures import ThreadPoolExecutor #線程池
import time

class ExecutorBase(object):
    executor = ThreadPoolExecutor(5)#線程池
class DebugWebsocket(tornado.websocket.WebSocketHandler, ExecutorBase):
    user_list=[] #成員數組

    def check_origin(self, origin):
        #校驗權限,允許所有連接配接,或,隻允許某域名
        return True

    def open(self):
        print("有新連接配接",self.request.remote_ip,self.get_query_argument("aa",""))#get取值
        self.user_list.append(self)#添加成員到數組

    @gen.coroutine #多線程運作
    def on_message(self, message):#收消息
        print("收到->",message)
        # resp = yield self.resp_time(message)#異步轉同步
        for A in self.user_list:
            A.write_message(message)
        # self.write_message(resp)

    def on_close(self):
        self.user_list.remove(self)#删除數組成員
        print("連接配接斷開",self.request.remote_ip)

    @run_on_executor #同步轉異步
    def resp_time(self, message):
        # time.sleep(5)
        return message

    @classmethod #類修飾符,不用new也能調用
    def zhudong(cls,message):
        print(112)
        for A in cls.user_list:
            A.write_message(message)


class MainHandler(tornado.web.RequestHandler):
    def get(self):
        #http調用socket方法
        DebugWebsocket.zhudong('主動發消息')
        self.write("Hello, world")


if __name__ == '__main__':
    print('->start')
    tornado.options.parse_command_line() #全局顯示指令行
    app=tornado.web.Application([ #路由
        (r"/w", DebugWebsocket),
        (r"/", MainHandler),
    ])
    app.listen(5000)
    IOLoop.current().start()