个人博客

Tornado WebSocket 的使用

WebSocket协议提供了在客户端和服务器之间持久连接的双向通道。协议本身使用新的ws://URL格式,但它是在标准的HTTP上实现的。通过使用HTTP和HTTPS端口,它避免了从web代理后的网络连接站点时引入的各种问题。

Tornado在websocket模块中提供了一个WebSocketHandler类。这个类提供了和已连接的客户端通信的websocket事件和方法的钩子。当一个新的websocket连接被打开时,open方法被调用,而on_message和on_close方法分别在连接接收到新的消息和客户端关闭时被调用。此外,WebSocketHandler类还提供了write_message方法用于向客户端发送消息,close方法用于关闭连接。

class WSHandler(tornado.websocket.WebSocketHandler):
    def open(self):
        self.write_message('connected!')

    def on_message(self, message):
        self.write_message(message)

这就是一个简单的websocket的使用,WSHandler类中,open方法是在建立连接时调用的函数,write_message就是服务器通过websocket向客户端发送消息,而on_message就是每次接收到客户端发送的请求时的响应。

使用Tornado编写一个websocket连接,主要就是重写一些WebSocketHandler类中的方法,现在我们来看下一些方法的作用:

open():当websocket连接建立后被调用。

on_message(message):该方法必须被重写,当收到客户端发送的消息时被调用。

on_close():当websocket关闭后被调用。

write_message(message, binary=False):向客户端发送消息,message可是字符串或字典。若binary为False时,则message以utf8编码发送;若binary为True时,可以发送任何字节码。

close():关闭websocket连接。

check_origin(origin):判断源origin,对于符合条件的请求源origin允许其连接,否则返回403。可以重写此方法来解决websocket的跨域请求问题。

一个简单的websocket的demo:

import tornado.ioloop
import tornado.web
import tornado.websocket

class ConnectHandler(tornado.websocket.WebSocketHandler) :
    def check_origin(self, origin) :
        '''重写同源检查 解决跨域问题'''
        return True

    def open(self) :
        '''新的websocket连接后被调动'''
        self.write_message('Welcome')

    def on_close(self) :
        '''websocket连接关闭后被调用'''

    def on_message(self, message) :
        '''接收到客户端消息时被调用'''
        self.write_message('new message :' + message)  # 向客服端发送

class MainHandler(tornado.web.RequestHandler) :
    def get(self) :
        self.write("Hello world")

class Application(tornado.web.Application) :
    def __init__(self) :
        handlers = [
            (r'/index', MainHandler),
            (r'/ws', ConnectHandler)
        ]
        tornado.web.Application.__init__(self, handlers)

if __name__ == "__main__" :
    app = Application()
    app.listen(8000)
    tornado.ioloop.IOLoop.current().start()
相关标签
回到顶部