Http协议是一种请求响应式协议, 不允许服务端主动向客户端发送信息.

短轮询是一种简单的实现服务端推送消息的解决方案, 客户端以一定间隔自动向服务端发送刷新请求, 服务端返回要推送的消息作为响应.

短轮询存在严重缺陷:

短轮询需要进行高频率的网络通信, 且收到大多数轮询请求时服务端没有消息需要推送.

需要维护大量Http连接, 严重消耗资源

如果手写一个短轮询的话你会发现, 短轮询带来的问题不止这些.

长轮询

长轮询是客户端向服务端发送一个刷新请求, 并保持连接打开. 服务端收到请求后不立即响应,等到需要推送消息时再返回. 然后, 客户端再次发送刷新请求并等待推送.

长轮询不再需要频繁发送刷新请求, 但是长期等待的Http连接可能断开, 需要考虑异常处理.

长轮询请求等待过程中服务端处理进程不能被阻塞, tornado的异步IO机制可以方便的使用长轮询.

import tornado.httpserver

from tornado.ioloop import IOLoop

import tornado.options

import json

from tornado.web import Application, RequestHandler, asynchronous

class ChatApp(Application):

def __init__(self):

handlers = [

(r'/new-message', NewMsgHandler),

(r'/update-message', UpdateMsgHandler)

]

super(ChatApp, self).__init__(self, handlers=handlers)

self.cache = []

class NewMsgHandler(RequestHandler):

def __init__(self, app):

self.app = app

def post(self):

msg = self.get_argument('msg')

self.app.cache.append(msg)

class UpdateMsgHandler(RequestHandler):

def __init__(self, app):

self.app = app

@asynchronous

def post(self):

if self.request.connection.stream.closed():

return

response_json = json.dumps(self.app.cache)

self.write(response_json)

self.finish()

def main():

tornado.options.parse_command_line()

app = ChatApp()

http_server = tornado.httpserver.HTTPServer(app)

http_server.listen(options.port)

tornado.ioloop.IOLoop.instance().start()

if __name__ == '__main__':

main()

示例的完整代码,请去草民的仓库

这篇博客提供了一个更为强大的基于长轮询的聊天室, 而且草民非常喜欢他的代码风格.

WebSocket

WebSocket是HTML5协议中提出的客户-服务器通信协议, 它允许双方以类似TcpSocket的方式进行通信.

它基于标准Http协议实现, 但使用新的ws://URL格式.

Tornado在websocket模块中提供了一个WebSocketHandler类,

open方法在一个新的WebSocket连接打开时被调用,

on_message方法在连接接收到新的消息时被调用

on_close方法在客户端关闭时被调用

write_message(message, binary=False)方法可以通过WebSocket向对方发送数据

- 若binary=False, message可以是string或者dict(会被自动编码为JSON),

- 若binary=True, message可以是任意byte string

继承WebSocketHandler并重写自己上述方法,实现基于WebSocket的应用.

来自tornado官方文档的示例:

class EchoHandler(WebSocketHandler):

def allow_draft76(self):

return True

def check_origin(self, origin):

return True

def open(self):

print "new client opened"

def on_close(self):

print "client closed"

def on_message(self, message):

self.write_message(message)

allow_draft76与check_origin用于进行安全性校验, 只有它们都返回True时WebSocket才能正常连接.

Python WebSocket

WebSocket虽然是为Web应用设计的, 为了减轻后端的开发压力可以采用WenSocket代替Tcp Socket与后端交互.

Websocket-client是Python Websocket支持包,可以使用pip安装:

pip install websocket-client

websocket-client提供了几个低级API:

建立websocket连接

ws = create_connection("ws://echo.websocket.org/")

发送消息

ws.send(msg)

接收消息

result = ws.recv()

关闭连接

ws.close()

websocket也提供了JS风格的API, 来自官方文档的示例:

import websocket

import thread

import time

def on_message(ws, message):

print message

def on_error(ws, error):

print error

def on_close(ws):

print "### closed ###"

def on_open(ws):

def run(*args):

for i in range(3):

time.sleep(1)

ws.send("Hello %d" % i)

time.sleep(1)

ws.close()

print "thread terminating..."

thread.start_new_thread(run, ())

if __name__ == "__main__":

websocket.enableTrace(True)

ws = websocket.WebSocketApp(

"ws://echo.websocket.org/",

on_message = on_message,

on_error = on_error,

on_close = on_close

)

ws.on_open = on_open

ws.run_forever()

tornado 10 长轮询和 websocket

tornado 10 长轮询和 websocket 一.长轮询 #在网页,我们经常扫码登录,那么问题来了,前端是如何知道用户在手机上扫码登录的呢 这里就需要用到长轮询 #长轮询 #客户端能够不断地向服 ...

你想了解的轮询、长轮询和websocket都在这里了

日常生活中,有很多需要数据的实时更新,比如群聊信息的实时更新,还有投票系统的实时刷新等 实现的方式有很多种,比如轮询.长轮询.websocket 轮询 轮询是通过设置页面的刷新频率(设置多长时间自动刷 ...

php websocket-网页实时聊天之PHP实现websocket(ajax长轮询和websocket都可以时间网络聊天室)

php websocket-网页实时聊天之PHP实现websocket(ajax长轮询和websocket都可以时间网络聊天室) 一.总结 1.ajax长轮询和websocket都可以时间网络聊天室 ...

轮询、长轮询和websocket

一.轮询 在一些需要进行实时查询的场景下应用比如投票系统: 大家一起在一个页面上投票 在不刷新页面的情况下,实时查看投票结果 1.后端代码 from flask import Flask, rende ...

python之轮询、长轮询、websocket

轮询 ajax轮询 ,ajax轮询 的原理非常简单,让浏览器隔个几秒就发送一次请求,询问服务器是否有新信息. 1.后端代码 from flask import Flask,render_templat ...

短连接、长连接、轮询、长轮询、WebSocket

短连接 建立连接——数据传输——关闭连接...建立连接——数据传输——关闭连接 定义:短连接是指通讯双方有数据交互时,就建立一个连接,数据发送完成后,则断开此连接,即每次连接只完成一项业务的发送. 应 ...

tornado长轮询

1.什么是长轮询顾名思义,长轮询就是不停循环请求服务器,获取最新信息.长轮询分为两类:1)浏览器以固定时间间隔向服务器发送请求缺点是轮询频率要足够快,但又不能太频繁,否则当成百上千个客户端不断请求,会 ...

长连接、短连接、长轮询和WebSocket

//转发,格式待整理 2017-08-0519784View0 对这四个概念不太清楚,今天专门搜索了解一下,总结一下: 长连接:在HTTP 1.1,客户端发出请求,服务端接收请求,双方建立连接,在服务 ...

了解轮询、长轮询、长连接、websocket

业务开发中我们往往会有一些需要即时通信的场景,比如微信扫码登录.聊天功能. 下面这四种方式都可以实现即时通信. 轮询: 浏览器通过定时器每隔一段时间向服务器端发送请求,服务器端收到请求并响应请求.没有 ...

随机推荐

oracle EXP导出一张表时使用query参数指定where条件

oracle exp 导出一个表的部分内容,使用query参数可加上SQL的where条件进行过滤 注意:如果需要使用到日期字符串格式等单引号,需要使用双引号将where条件括起来,而且双引号要用\做 ...

R语言XML格式数据导入与处理

数据解析 XML是一种可扩展标记语言,它被设计用来传输和存储数据.XML是各种应用程序之间进行数据传输的最常用的工具.它与Access,Oracle和SQL Server等数据库不同,数据库提供了更强 ...

FineUi导出时禁用ajax即EnableAjax="false"出现问题的解决方法

fineui导出时会出现乱码, 在按钮上添加EnableAjax="false"属性禁用ajax就可以正常导出.但如果我在后台代码中直接return 而不进行导出流操作,则前台脚本 ...

CentOS 7 防火墙和端口配置

centos 7 防火墙和端口配置--解决 RHEL 7/ CentOS 7/Fedora 出现Unit iptables.service failed to load # 第一步,关闭firewal ...

深入学习Heritrix---解析CrawlController(转)

当我们以Web UI方式使用Heritrix时,点击任务开始(start)按钮时,Heritrix就开始了它的爬取工作.但它的内部 执行流程是怎样的呢?别急,下面将慢慢道来. (一)CrawlJobH ...

linux切换用户

当前使用root账户 [root@localhost chucklu]# cd[root@localhost ~]# pwd/root 切换到普通账户 [root@localhost ~]# su c ...

求第i个小的元素 时间复杂度O(n)

#include //求第i个小的元素 时间复杂度O(n) #include #include using na ...

九度oj题目1207:质因数的个数

题目描述: 求正整数N(N>1)的质因数的个数. 相同的质因数需要重复计算.如120=2*2*2*3*5,共有5个质因数. 输入: 可能有多组测试数据,每组测试数据的输入是一个正整数N,(1&l ...

c++面经积累<2>

4.类成员初始化方式:列表初始化和赋值初始化 赋值初始化通过在函数体内进行赋值,列表初始化,在构造函数后面加上冒号,使用初始化列表进行初始化.在函数体内进行初始化,是在所有的数据成员被分配内存空间后进 ...

P1308 统计单词数

P1308 题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定一个单词,请 ...

ajax长轮询tornado,Tornado长轮询和WebSocket相关推荐

  1. ajax使用频率,AJAX轮询频率 - 要长期轮询还是不轮询长轮询?

    我正在构建一个需要相对不变的数据库轮询的网页组件.我可以看到两种不同的方法,我想知道他们中的一个是否比其他人好,或者如果我错过了第三个选择.AJAX轮询频率 - 要长期轮询还是不轮询长轮询? 1)发送 ...

  2. 【恋上数据结构】动态规划(找零钱、最大连续子序列和、最长上升子序列、最长公共子序列、最长公共子串、0-1背包)

    动态规划(Dynamic Programming) 练习1:找零钱 找零钱 - 暴力递归 找零钱 - 记忆化搜索 找零钱 - 递推 思考题:输出找零钱的具体方案(具体是用了哪些面值的硬币) 找零钱 - ...

  3. c语言实现图片轮播,纯css实现轮播图

    轮播图的实现原理其实是比较简单的 举个例子 main的宽度是100px div-main的宽度是500px 我们用js控制div-main往左或往右移动,这样就实现了轮播,简单把 好了,先介绍个 cs ...

  4. 股债轮动、股票指数间轮动和行业间轮动的一种新思路:GEYR策略

    前言 GEYR一般定义为长期国债收益率与证券市场股利收益率的比值,可用于股债配置.当该值增大时,债券配置价值较高:反之则股票配置价值较高.GEYR策略的本质思想在于将标的资产视为零息债券,并对票息进行 ...

  5. Android轮播换背景,Android 轮播图的实现方法总结

    SliderLayout LoopViewPage BGABanner 自定义view实现轮播 仿魅族的banner轮播图 1. SliderLayout 预览效果如下 687474703a2f2f7 ...

  6. 中科院考研经历①--一轮复习总结及二轮复习规划

    一志愿上岸中科院沈计所考研经历: 文章专栏(点击跳转) 作为一志愿上岸中科院沈计所考研经历文章专栏的第一篇,特附上成绩单以及拟录取通知. 一轮复习总结及二轮复习规划 2022年4月18日星期一15点3 ...

  7. 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离

    最大子序列 最大子序列是要找出由数组成的一维数组中和最大的连续子序列.比如{5,-3,4,2}的最大子序列就是 {5,-3,4,2},它的和是8,达到最大:而 {5,-6,4,2}的最大子序列是{4, ...

  8. 动态规划套路在最长公共子串、最长公共子序列和01背包问题中的应用

    2019独角兽企业重金招聘Python工程师标准>>> 适合动态规划(DP,dynamic programming)方法的最优化问题有两个要素:最优子结构和重叠子问题. 最优子结构指 ...

  9. des vue 双倍长 解密_[转]单倍长密钥加密和双倍长密钥加密,银联直联终端62域难点详解...

    首先来看一段文字: ------------------– 银联直联终端测试中,在POS终端签到的应答报文中,62域是如何规定的? 62域长度应为24或40个字节.对于单倍长密钥算法:前12个字节为P ...

最新文章

  1. 关于捕获键盘信息的processDialogkey方法
  2. CyberRT使用笔记
  3. java字母反过来_java之字母反转~~ - Plight - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  4. 微服务~Eureka实现的服务注册与发现及服务之间的调用
  5. springboot超详细教程_CG原画插画教程:超详细线稿教程
  6. 数据恢复软件(绝对真实可用)
  7. 材料凝固计算机模拟,颗粒增强金属基复合材料凝固过程的计算机模拟_谢国宏.pdf...
  8. jdbc心得-2-数据库与java相结合
  9. 4: Consolidating Datasets ( Challenge: Data Munging Using The Command Line)
  10. Matlab程序接口应用总结
  11. SpringBoot项目实现网络测速功能
  12. 镁客·请讲|云扩科技Silver Sun:以场景化解决方案+人人可用的RPA推动数字化落地
  13. Solidworks建模画一个盒子
  14. AWS 云产品和云计算基础知识详解
  15. 在excel中使用offset和match函数进行二维表对二维表的匹配
  16. python股票分析系统代码_Python 代码学习,用于股票分析
  17. W ndows 10模拟器,手机windows10模拟器下载_手机windows10模拟器安卓版下载中文 v0.20.0.3b-66街机网...
  18. 如何:创建 C# 控制台应用程序
  19. 华为手机自带邮箱如何添加新浪邮箱账号
  20. 微信小程序苹果手机边框显示不全解决办法

热门文章

  1. 连续变量离散化的几种方法
  2. 服务器后台训练模型,查看后台进程,关闭后台进程
  3. JAVA学习笔记——JVM、JDK和JRE(包含JDK的下载与安装)
  4. JAVA花布的特点_印花布是什么 印花布面料的特点
  5. window命令查看cpu核数_如何查看win10系统CPU核数?
  6. 鼠标移入移出事件,mouseover、mouseenter区别
  7. Python遍历列表,一次取多个值
  8. Java SE 7 Update 17的安装配置及相关问题解决
  9. 情人节到了,送自己一个女朋友
  10. centos添加明细路由的方法