简单tornado websocket服务器

指南:

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()

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

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Tornado是一个Python的Web框架,它支持异步编程和非阻塞IO操作。Tornado中的WebSocket是一种实现了全双工通信的协议,它允许服务器和客户端之间进行实时的双向通信。 在Tornado中使用WebSocket,你可以通过继承tornado.websocket.WebSocketHandler类来创建一个WebSocket处理器。WebSocketHandler提供了一些方法来处理WebSocket连接的不同事件,例如连接建立、消息接收和连接关闭等。 以下是使用TornadoWebSocket的一般步骤: 1. 创建一个WebSocket处理器类,继承自tornado.websocket.WebSocketHandler。 2. 在处理器类中实现on_message()方法,用于处理接收到的消息。 3. 在处理器类中实现open()方法,用于处理WebSocket连接建立时的操作。 4. 在处理器类中实现on_close()方法,用于处理WebSocket连接关闭时的操作。 5. 在Tornado应用程序中定义路由,将URL映射到WebSocket处理器类。 6. 启动Tornado应用程序。 下面是一个简单的示例代码,演示了如何在Tornado中使用WebSocket: ```python import tornado.websocket import tornado.web import tornado.ioloop class WebSocketHandler(tornado.websocket.WebSocketHandler): def open(self): print("WebSocket连接建立") def on_message(self, message): print("接收到消息:", message) self.write_message("服务器已收到消息:" + message) def on_close(self): print("WebSocket连接关闭") app = tornado.web.Application([ (r"/websocket", WebSocketHandler), ]) if __name__ == "__main__": app.listen(8888) tornado.ioloop.IOLoop.current().start() ``` 在上面的示例中,我们创建了一个WebSocket处理器类WebSocketHandler,并实现了open()、on_message()和on_close()方法来处理不同的事件。在应用程序中,我们将URL "/websocket" 映射到WebSocketHandler类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值