简单tornado websocket服务器

本文介绍了一个基于Tornado框架实现WebSocket的具体示例。该示例详细展示了如何通过继承tornado.websocket.WebsocketHandler并重写open、on_close、on_message及check_origin方法来创建WebSocket服务器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

指南:

tornado.websocket

所有的实现都是通过tornado中的这个模块进行的二次开发,我们需要继承:tornado.websocket.WebsocketHandler

其中我们需要复写其中的四个方法:

1、open()

这个方法是在刚开始连接过来的时候会触发这个方法,我们可以在这个方法中去实现自己想在连接刚上线的时候需要做的事情。

2、on_close()

看名字就知道这个方法是在连接断掉的时候触发的方法,当然了,你也可以在这个方法里面去写在连接断开的时候需要做的事情。

3、on_message()

这个方法是在接受到来自客户端的数据的时候触发的方法,在这个方法里面我们可以去实现对数据的判断从而调用对应的方法,去处理该做的事情。

4、check_origin()

由官方的文档可知,如果不加这个方法,会触发403错误,所以直接加上下面的代码即可:

小试牛刀:

import tornado.escape
import tornado.ioloop
import tornado.web
import tornado.websocket
import tornado.options
import time
import logging
import uuid
import sys,os
from tornado.options import define, options


define('port', default=8888, help="The tornado server port", type=int)


class WebSocketSever(tornado.websocket.WebSocketHandler):
    bao_cons = set()
    bao_waiters = {}
    global con_key

    def open(self):
        sole_id = str(uuid.uuid4()).upper()
        print(sole_id)
        self.con_key = sole_id
        self.bao_waiters["{}".format(sole_id)] = self
        self.bao_cons.add(self)
        self.write_message({"websocket_sole_id": sole_id})
        logging.info("websocket opened!")
        print(self.bao_cons)

    def on_message(self, message):

        print(type(message))
        if message == "close":
            self.close()
            return
        try:
            parse_data = tornado.escape.json_decode(message)
            if parse_data["user"] and parse_data["content"]:
                user = parse_data["user"]
                content = parse_data["content"]
                if not user or not content:
                    logging.info("Date is wrong!")
                    return
                else:
                    for key in self.bao_waiters.keys():
                        if key == user:
                            try:
                                self.bao_waiters[key].write_message("{}".format(content))
                            except Exception as e:
                                logging.info(e)
                            finally:
                                logging.info("process finished!")
        except:
            for con in self.bao_cons:
                con.write_message(message)

    def check_origin(self, origin: str):
        return True

    def allow_draft76(self):
        return True

    def on_close(self):
        self.bao_cons.remove(self)
        self.bao_waiters.pop(self.con_key)

        logging.info("websocket closed!")
        print(self.bao_cons)


class Application(tornado.web.Application):
    def __init__(self, handlers, setting):
        super(Application, self).__init__(handlers, **setting)


def main():
    options.parse_command_line()
    handlers = [(r"/websocket", WebSocketSever)]
    setting = dict(xsrf_cookies=False)
    app = Application(handlers, setting)
    print(options.port)
    app.listen(options.port)
    tornado.ioloop.IOLoop.current().start()


if __name__ == '__main__':
    main()

其他的一些东西,大家可以自己去尝试了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值