tornado websocket

​#coding:utf-8html

import os.pathweb

 

import tornado.httpserverjson

import tornado.webwebsocket

import tornado.ioloopapp

import tornado.optionssocket

import tornado.httpclienttornado

import tornado.websocketoop

 

import jsonpost

import hashliburl

import urllib

 

TOKEN_KEY = 'aadccww'

 

class IndexHandler(tornado.web.RequestHandler):

    def get(self):

        #self.write('hello world!')

        self.render('index.html')

        

    def post(self):

        type = self.get_argument('type')

 

class MasterHandler(tornado.web.RequestHandler):

    

    def post(self):

    

        response_body = {

            'code' : 0,

            'msg' : 'success'

        }

        type = self.get_argument('type')

        message = self.get_argument('message')

        token = self.get_argument('token')

        

        m2 = hashlib.md5()

        md5_str = "|".join((type,message,TOKEN_KEY))

        try:

            m2.update(md5_str)

        except TypeError:

            m2.update(md5_str.encode('utf8'))

        sign = m2.hexdigest()

        

        if token != sign:

            response_body['code'] = 10001

            response_body['msg'] = 'token failed'

            self.write(response_body)

            return

        

        #push to clients

        message = json.loads(message)

        cid = str(message['cid'])

        SocketHandler.send_to_all({'type':type,'message':message,'cid':cid})

        self.write(response_body)

        

class SocketHandler(tornado.websocket.WebSocketHandler):

    """docstring for SocketHandler"""

    clients = set()

    def check_origin(self, origin):

        parsed_origin = urllib.parse.urlparse(origin)

        return parsed_origin.netloc.endswith(".xxxx.org")

    

    @staticmethod

    def send_to_all(message):

        if isinstance(message,dict):

            message_str = json.dumps(message)

        else:

            message_str = message

        print(message_str)    

        for c in SocketHandler.clients:

            if c.get_argument('cid') == message['cid']:

                c.write_message(message_str)

 

    def open(self):

        self.write_message(json.dumps({

            'type': 'sys',

            'message': 'Welcome to WebSocket',

            'cid':self.get_argument('cid')

        }))

        SocketHandler.send_to_all({

            'type': 'sys',

            'message': str(id(self)) + ' has joined',

            'cid':self.get_argument('cid')

        })

        SocketHandler.clients.add(self)

 

    def on_close(self):

        SocketHandler.clients.remove(self)

 

    def on_message(self, message):

        #SocketHandler.send_to_all({

        #    'type': 'comment',

        #    'message': message,

        #    'cid':self.get_argument('cid')

        #})

        pass

 

 

##MAIN

if __name__ == '__main__':

    app = tornado.web.Application(

        handlers=[

          (r"/", IndexHandler), 

          (r"/master", MasterHandler),

          (r"/live", SocketHandler),

        ],

        debug = True,

        template_path = os.path.join(os.path.dirname(__file__), "templates"),

        static_path = os.path.join(os.path.dirname(__file__), "static")

    )

    app.listen(8000)

    tornado.ioloop.IOLoop.instance().start()

相關文章
相關標籤/搜索