百度秒收录的网站,定制网站开发公司生物医药,免费万能视频提取器,网站建设与行政管理WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。Tornado中定义了tornado.websocket.WebSocketHandler来处理websocket请求。Tornado框架的安装以及入门这里就不说了#xff0c;想入门tornado的请移步我的另一篇文章奥小飞#xff1a;基于Python的…WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。Tornado中定义了tornado.websocket.WebSocketHandler来处理websocket请求。Tornado框架的安装以及入门这里就不说了想入门tornado的请移步我的另一篇文章奥小飞基于Python的Tornado框架入门zhuanlan.zhihu.comWebSocketHandler类中方法简介open()当websocket连接建立后被调用on_message(message) *该方法必须被重写当收到客户端发送的消息时被调用on_close()当websocket连接关闭后被调用write_message(message, binaryFalse)向客户端发送消息message可以是字符串或字典(字典会被转为json)。若binary为False则message以utf8编码发送二进制模式(binaryTrue)时可发送任何字节码。close()关闭websocket连接check_origin(origin)判断源origin对于符合条件(返回判断结果为True)的请求源origin允许其连接否则返回403。可以重写此方法来解决WebSocket的跨域请求(如始终return True)。websocket demoimport tornado.ioloopimport tornado.webimport tornado.websocketclass ConnectHandler(tornado.websocket.WebSocketHandler) :def check_origin(self, origin) :重写同源检查 解决跨域问题return Truedef 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()前端页面demoTornado WebSocketConnect websocket:function sendMsg() {if (WebSocket in window) {var ws new WebSocket(ws://localhost:8000/ws);ws.onopen function() {ws.send(Hello);};ws.onmessage function (evt) {alert(evt.data);};}}这个demo创建了一个websocket服务并监听8000端口在浏览器建立连接之后会触发open()方法向浏览器推送“welcome”消息在收到浏览器发送的消息后会触发on_message()方法向浏览器推送“new message :”消息。到此为之一个简单的websocket应用已经可以了。但是这个demo太过于简单他只实现了在建立连接时和收到消息时的一些操作并没有体现websocket的主要作用(实时推送数据)。websocket demo 进阶import tornado.ioloopimport tornado.webimport tornado.websocketclass ProStatus():connector {} # 记录当前连接的userdef user_connect(self, user):if user not in self.connector:self.connector[user] set()def user_remove(self, user):self.connector.remove(user)def trigger(self, message): 向所有被记录的客户端推送最新内容 for user in self.connector:user.write_message(message)class ReceiveHandler(tornado.web.RequestHandler):def get(self):msg self.get_argument(msg, )ProStatus().trigger(msg) # 接收到消息之后推送class ConnectHandler(tornado.websocket.WebSocketHandler):def check_origin(self):重写同源检查 解决跨域问题return Truedef open(self):新的websocket连接后被调动ProStatus().user_connect(self) #用户连接后记录self.write_message(Welcome)def on_close(self):websocket连接关闭后被调用ProStatus().user_remove(self) # 断开连接后removedef on_message(self, message):接收到客户端消息时被调用self.write_message(new message : message)class IndexHandler(tornado.web.RequestHandler):def get(self):self.write(Hello world)class Application(tornado.web.Application):def __init__(self):handlers [(r/index, IndexHandler),(r/ws, ConnectHandler),(r/receive, ReceiveHandler)]tornado.web.Application.__init__(self, handlers)if __name__ __main__:app Application()app.listen(8000)tornado.ioloop.IOLoop.current().start()问题心跳包如果websocket隔一段时间不推送数据那么前端的连接就会自动断开 所以前端建立websocket连接时需要加入心跳包机制。 当然心跳包不单单是为了解决该问题也是为了解决各种意外断开的情况心跳包很有必要。 心跳包的原理就是每隔一定的时间检查websocket连接是否断开在没有断开的情况下隔一定的时间给服务端发送一条消息这条消息要确保服务端可以回应如果断开则进行重连。至于前端具体怎么实现心跳包的代码请自行百度。