Tornado WebSocket 的使用
作者:向前的步伐 / 发表: 2019年8月25日 23:39 / 更新: 2019年8月25日 23:55 / tornado / 阅读量:796
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()