目录

WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。 WebSocket通信协议于2011年被IETF定为标准RFC 6455,WebSocketAPI被W3C定为标准。 在WebSocket API中,浏览器和服务器只需要要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

WebSocket

WebSocket是建立在 TCP 协议之上,与 HTTP 协议有着良好的兼容性。那么既然已经有了HTTP协议,为什么还需要一个WebSocket协议呢。这是因为HTTP只允许由客户端向服务端发送数据, 而无法直接由服务端主动向客户端推送信息。

WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端直接向客户端推送数据而不需要客户端进行请求,两者之间可以创建持久性的连接,并允许数据进行双向传送。WebSocket协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。

1. Tornado的WebSocket模块

Tornado提供支持WebSocket的模块是tornado.websocket,其中提供了一个WebSocketHandler类用来处理通讯。

WebSocketHandler.open() 当一个WebSocket连接建立后被调用。

WebSocketHandler.on_message(message) 当客户端发送消息message过来时被调用,注意此方法必须被重写。

WebSocketHandler.on_close() 当WebSocket连接关闭后被调用。

WebSocketHandler.write_message(message, binary=False) 向客户端发送消息messagea,message可以是字符串或字典(字典会被转为json字符串)。若binary为False,则message以utf8编码发送;二进制模式(binary=True)时,可发送任何字节码。

WebSocketHandler.close() 关闭WebSocket连接。

WebSocketHandler.check_origin(origin) 判断源origin,对于符合条件(返回判断结果为True)的请求源origin允许其连接,否则返回403。可以重写此方法来解决WebSocket的跨域请求(如始终return True)。

2. WebSocket使用示例

class WebSocketHandler(tornado.websocket.WebSocketHandler):
    def open(self):
        self.application.cart.register(self.callback)

    def on_close(self):
        self.application.cart.unregister(self.callback)

    def on_message(self):
        pass

    def callback(self,count):
        self.write_message('{"count":"%s"}'%count)