python tornado websocket_基于Python Tornado框架的websocket服务

WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。

Tornado中定义了tornado.websocket.WebSocketHandler来处理websocket请求。

Tornado框架的安装以及入门这里就不说了,想入门tornado的请移步我的另一篇文章奥小飞:基于Python的Tornado框架入门​zhuanlan.zhihu.com

WebSocketHandler类中方法简介

open()

当websocket连接建立后被调用

on_message(message) *该方法必须被重写

当收到客户端发送的消息时被调用

on_close()

当websocket连接关闭后被调用

write_message(message, binary=False)

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

close()

关闭websocket连接

check_origin(origin)

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

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

前端页面demo

Tornado WebSocket

Connect 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.ioloop

import tornado.web

import tornado.websocket

class ProStatus():

connector = {} # 记录当前连接的user

def 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 True

def open(self):

'''新的websocket连接后被调动'''

ProStatus().user_connect(self) #用户连接后记录

self.write_message('Welcome')

def on_close(self):

'''websocket连接关闭后被调用'''

ProStatus().user_remove(self) # 断开连接后remove

def 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连接是否断开,在没有断开的情况下隔一定的时间给服务端发送一条消息,这条消息要确保服务端可以回应,如果断开则进行重连。至于前端具体怎么实现心跳包的代码请自行百度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/502885.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信网页开发教程 php,PHP实现微信网页授权开发教程,php授权教程_PHP教程

PHP实现微信网页授权开发教程,php授权教程微信网页授权是服务号才有的高级功能,开发者可以通过授权后获取用户的基本信息;在此之前,想要获取消息信息只能在用户和公众号交互时根据openid获取用户信息;而微信网页授权可…

lstm原文_LSTM模型与水文模型在径流模拟中的比较

学术简报题目:Comparison of Long Short Term Memory Networks and the Hydrological Model in Runoff Simulation作者:Hailin You1,Hongxiang Fan2,Ligang Xu2,Yongmi Wu1,*,Lizhen Liu2 and Zhong Yao1作者单位:1 Poyang Lake Research Center, Jiangxi Academy of Sciences,…

php 获取已用空间,PHP5:获取导入的名称空间列表 - php

是否可以在当前上下文中获取PHP文件中所有导入的类/命名空间的列表?例如:namespace A;use B, C\D;我想得到这个数组:array(B, C\D);原因是我正在构建一个Mapper注册表,并且希望能够在当前上下文中使用别名类名而不是全名来查询该M…

[英语单词] piss in the wind

有点粗俗的俚语:piss in the wind。 感觉这个谚语是写在实:就是找不准点,pointless;然后引申代表是浪费时间。 https://lkml.org/lkml/2006/10/10/130 This is not a pointless piss-in-the-wind discussion; unless we define ra…

pythonos模块介绍_Python OS模块介绍

OS模块简单的来说它是一个Python的系统编程的操作模块,可以处理文件和目录这些我们日常手动需要做的操作。可以查看OS模块的帮助文档:>>> import os #导入os模块>>> help(os) #查看os模块帮助文档,里面详细的模块相关函数…

php 安装 bzip2,php如何安装bzip2

php安装bzip2的方法:首先安装扩展依赖的系统bzip2开发库;然后编译安装php源码包目录下的“ext/bz2”扩展;最后修改“php.ini”配置文件即可。php安装bzip2安装扩展依赖的系统bzip2开发库sudo yum install bzip2-devel编译安装php源码包目录下…

python处理滑块验证码_使用python实现滑动验证码

首先安装一个需要用到的模块pip install social-auth-app-django安装完后在终端输入pip list会看到social-auth-app-django 3.1.0social-auth-core 3.0.0然后可以来我的github,下载关于滑动验证码的这个demo:https://github.com/Edward66/slide_auth_cod…

java 虚拟机 字节码,JAVA虚拟机:虚拟机字节码执行引擎

“虚拟机”是一个相对“物理机”的概念,这两种机器都有代码执行能力。物理机的执行引擎是直接建立在处理器、硬件、指令集和操作系统层面上的。虚拟机的执行引擎由自己实现,自行制定指令集与执行引擎的结构体系,并可执行不被硬件直接支持的指…

mysql 触发器不能同时 insert or update or delete_MySQL6:触发器

什么是触发器MySQL的触发器(trigger)和存储过程一样,都是嵌入到MySQL中的一段程序。触发器是由事件来触发某个操作,这些事件包括INSERT、UPDATE和DELETE语句。如果定义了触发程序,当数据库执行这些语句的时候就会激发触发器执行相应的操作&am…

javabean连接mysql数据库,jsp+javabean 链接 mysql 数据库

JSPJavaBean html一、JavaBean类java首先先澄清 这个三个都是绝对路径 没有相对路径, E://test.txt 和 E:/test.txt 是一个意思 E:\\text.txt 用这样的写法是 \\ 转义了 ‘\’ .linux为何有\\ 的写法 和 / 这样的写法呢 ,由于window 默认的是\\ 这样…

mysql 强制使用索引_快速找出MySQL数据库冗余索引和未使用索引

冗余索引和未使用索引的危害随着上线的业务越来越多,在MySQL数据库中建的表也会越来越多,为提高查询访问速度,会创建相应的索引。但是由于技术人员的水平参差不齐,业务下线,代码逻辑变更等原因,导致线上数据…

java第一次课必修实验答案,Java第一次实验报告

北京电子科技学院(BESTI)实验报告课程:Java实验 班级:201352 姓名:池彬宁 学号:20135212成绩: 指导教师:娄佳鹏 实验日期:15.04.14实验密级: 预习程度…

python实现目标识别_Python10行代码实现目标检测

ImageAI可以让程序员和软件开发者只用几行代码,就能轻易地把最先进的计算机视觉技术整合到他们现有的以及新的应用程序里面。用ImageAI实现目标检测,你只需要以下步骤:安装Python安装ImageAI和相关函数库下载目标检测模型文件运行示例代码(只…

在matlab中求协方差,matlab里面的求协方差函数

一:matlab里面关于方差和协方差的几点需要注意的求均值的函数:mean求方差的函数:var标准差:方差:求协方差的函数:cov1 如果a,b是向量,则:cov(a,b)相当于是[D(a),cov(a,b);cov(b,a),D…

python做var模型_【Python金融量化】VaR系列(五):Copula模型估计组合VaR-阿里云开发者社区...

1. 资产组合VaR建模方法回顾文章中总结了通过DCC模型估计组合向前一日VaR的方法,整体思路如下:● 通过Garch族模型估计各资产的波动率● 通过DCC模型估计各资产间的相关系数,结合1得到资产组合的协方差矩阵● 在各资产正态性假设的前提下&…

matlab从矩阵中取rp开头文件,matlab trainrp

Af ] train(net, P,T, Pi, Ai,VV ,TV ) 3 [Y, Pf , Af , E, perf ] sim(net, P, Pi, Ai,T ) {tansig,purelin},trainrp BP lr......traingdm、traingda、 traingdx 、 trainrp 、 ...traingdm traingda traingdx trainrp train...{tansig,purelin},trainrp BP 网络的训练函数 训…

手机浏览器网址_「效率集」自定义网址导航高级功能介绍

「效率集」是国内仅有的几家提供了个性自定义导航的网站,功能比hao123强,用户体验优于百度导航首页,且支持聚合搜索,方便用户从不同渠道(网页,微博,微信公众号,知乎,维基…

属于服务器端运行的程序_生信分析云平台产品开发 - 5 生信分析pipeline服务器端运行...

在上文 [生信分析云平台产品开发 - 4 生信分析pipeline的图形化] 讨论了生信分析pipeline的图形化,如何用图形的方式显示生信pipeline,但是pipeline脚本按照变量的形式保存之后,如何运行,在什么环境下运行?是本文要解决…

c mysql 统计不重复数据库,MySQL_MySQL数据库中分组统计的问题,首先准备四张表A、B、C、D, - phpStudy...

MySQL数据库中分组统计的问题首先准备四张表A、B、C、D,--------------------------------A  | B  | C  | Da b | a c | a d | d e1 1 | 1 1 | 1 A | A 12 2 | 1 3 | 2 B | B 23 4 | …

TF卡里删掉文件后内存没变大_原来三星手机是这样清理内存的,难怪用好几年也不卡...

三星手机的耐用性一直都很高,而除了手机本身系统性能做的很好之外,手机的设置也是很人性化的。在三星手机使用了一段时间过后,手机里的内存会越来越大,手机里的垃圾也会越存越多,那么我们应该怎么清理手机中的内存呢&a…