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

#长轮询 #客户端能够不断地向服务器发送请求 #缺点:1、开销大 2、浪费资源 3、消耗流量
二、websocket
#由于长轮询消耗太多资源,主要原因是客户端和服务器并没有连接在一起,那么怎样能够让客户端和服务器一直保持连接? #这就需要用到WebSocket #正经介绍
#WebSocket协议是基于TCP的一种新的HTML5网络协议。它实现了浏览器和服务器全双工(full-duplex)通信----允许服务器主动发送信息给客户端。WebSocket通信协议于2011年被IETF定位标准RFC 6455,并被RFC7936所补充规范
#简单点说
#将客户端和服务器连接在了一起
三、websocket该如何使用呢
import tornado.ioloop
import tornado.options
import tornado.web
from tornado.options import define,options
import time
import util.ui_methods
import util.ui_modules
from data.user_modules import User #导入module包
from tornado.web import authenticated
from pycket.session import SessionMixin
import tornado.websocket
import datetime define('port',default=8080,help = 'run port',type=int) class BaseHandler(tornado.web.RequestHandler,SessionMixin):
def get_current_user(self):
current_user = self.session.get('user')
if current_user:
return current_user
return None class BaseWebSocketHandler(tornado.websocket.WebSocketHandler, SessionMixin):
def get_current_user(self):
current_user = self.session.get('user')
if current_user:
return current_user
return None class LoginHandler(BaseHandler): def get(self, *args, **kwargs):
nextname = self.get_argument('next','')
self.render('lesson2.html',nextname = nextname) def post(self, *args, **kwargs):
nextname = self.get_argument('next','')
user = self.get_argument('name')
password = self.get_argument('password','')
username =User.by_name(user)
if username and password == username[0].password:
self.session.set('user',username[0].username)
self.redirect(nextname)
else:
self.render('lesson2.html',nextname=nextname) class IndexHandler(BaseHandler):
@authenticated
def get(self):
self.render('websocket_08.html') class MessageHandler(BaseWebSocketHandler):
users = set() def open(self, *args, **kwargs):
MessageHandler.users.add(self)
for u in self.users:
u.write_message(
'%s-%s上线了'%(
self.current_user,
datetime.datetime.now().strftime('%Y-%m-%d%H:%M:%S'),
)
) def on_message(self, message):
for u in self.users: #实现先发送内容
u.write_message(
'%s-%s说:%s'%(
self.current_user,
datetime.datetime.now().strftime('%Y-%m-%d%H:%M:%S'),
message
)
) def on_close(self):
if self in MessageHandler.users:
MessageHandler.users.remove(self)
for u in self.users:
u.write_message(
'%s-%s下线了' % (
self.current_user,
datetime.datetime.now().strftime('%Y-%m-%d%H:%M:%S'),
)
) application = tornado.web.Application(
handlers=[
(r'/login', LoginHandler),
(r'/index', IndexHandler),
(r'/websocket', MessageHandler),
],
template_path = 'templates',
static_path= 'static',
autoescape = None,
ui_methods=util.ui_methods,
ui_modules=util.ui_modules,
cookie_secret = 'lidang',
login_url = '/login',
pycket = {
'engine':'redis',
'storage':{
'host':'localhost',
'port':6379,
'db_sessions':5,
'db_notifications':11,
'max_connections':2 ** 33,
},
'cookie':{
'expires_days':38,
'max_age':100
}
},
debug=True
) if __name__ == '__main__':
tornado.options.parse_command_line()
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()
四、客户端编码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title> WebSocket </title>
<link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.css" rel="stylesheet">
<style>
*{
margin: 0;
padding: 0;
}
.box{
width: 800px;
margin-left: auto;
margin-right: auto;
margin-top: 25px;
}
#text{
width: 685px;
height: 130px;
border: 1px solid skyblue;
border-radius: 10px;
font-size: 20px;
text-indent: 1em;
resize:none;
outline: none;
}
#text::placeholder{
color: skyblue;
}
.btn{
width: 100px;
margin: -27px 0 0px 8px;
}
#messages{
padding-left: 10px;
font-size: 25px;
}
#messages li{
list-style: none;
color: #000;
line-height: 30px;
font-size: 18px; }
</style>
</head>
<body>
<div class="box">
<div>
<textarea id="text" placeholder="请输入您的内容"></textarea>
<a href="javascript:WebSocketSend();" class="btn btn-primary">发送</a>
</div>
<ul id="messages">
</ul>
</div> <script src="{{ static_url('js/jquery-2.2.0.min.js') }}"></script> <script type="text/javascript"> var mes = document.getElementById('messages');
if("WebSocket" in window){
mes.innerHTML = "发送WebSocket请求成功!";
var ws = new WebSocket("ws://127.0.0.1:8080/websocket");
ws.onopen = function () {
alert('连接已打开请聊天')
};
ws.onmessage = function (goudan) { var received_msg = goudan.data; var aLi = $("<li>"+received_msg+"</li>");
$(mes).append($(aLi)) // 方法一
// $(aLi).appendTo(mes); // 方法二
};
ws.onclose = function () {
mes.innerHTML = mes.innerHTML + "<br>连接已经关闭...";
};
} else {
mes.innerHTML = "发送WebSocket请求失败!"
}
function WebSocketSend() {
ws.send($("#text").val());
}
</script> </body>
</html>
tornado 10 长轮询和 websocket的更多相关文章
- Tornado长轮询和WebSocket
Http协议是一种请求响应式协议, 不允许服务端主动向客户端发送信息. 短轮询是一种简单的实现服务端推送消息的解决方案, 客户端以一定间隔自动向服务端发送刷新请求, 服务端返回要推送的消息作为响应. ...
- 你想了解的轮询、长轮询和websocket都在这里了
日常生活中,有很多需要数据的实时更新,比如群聊信息的实时更新,还有投票系统的实时刷新等 实现的方式有很多种,比如轮询.长轮询.websocket 轮询 轮询是通过设置页面的刷新频率(设置多长时间自动刷 ...
- php websocket-网页实时聊天之PHP实现websocket(ajax长轮询和websocket都可以时间网络聊天室)
php websocket-网页实时聊天之PHP实现websocket(ajax长轮询和websocket都可以时间网络聊天室) 一.总结 1.ajax长轮询和websocket都可以时间网络聊天室 ...
- python之轮询、长轮询、websocket
轮询 ajax轮询 ,ajax轮询 的原理非常简单,让浏览器隔个几秒就发送一次请求,询问服务器是否有新信息. 1.后端代码 from flask import Flask,render_templat ...
- 长连接、短连接、长轮询和WebSocket
//转发,格式待整理 2017-08-0519784View0 对这四个概念不太清楚,今天专门搜索了解一下,总结一下: 长连接:在HTTP 1.1,客户端发出请求,服务端接收请求,双方建立连接,在服务 ...
- 轮询、长轮询和websocket
一.轮询 在一些需要进行实时查询的场景下应用比如投票系统: 大家一起在一个页面上投票 在不刷新页面的情况下,实时查看投票结果 1.后端代码 from flask import Flask, rende ...
- 短连接、长连接、轮询、长轮询、WebSocket
短连接 建立连接——数据传输——关闭连接...建立连接——数据传输——关闭连接 定义:短连接是指通讯双方有数据交互时,就建立一个连接,数据发送完成后,则断开此连接,即每次连接只完成一项业务的发送. 应 ...
- 1.轮询、长轮询、websocket简介
一.轮询 前端每隔固定时间向后台发送一次请求,询问服务器是否有新数据 缺点: 延迟,需要固定的轮询时间,不一定是实时数据 大量耗费服务器内存和宽带资源,因为不停的请求服务器,很多时候 并没有新的数 ...
- 10分钟学会web通讯的四种方式,短轮询、长轮询(comet)、长连接(SSE)、WebSocket
一般看到标题我们一般会产生下面几个问题??? 什么是短轮询? 什么是长轮询? 长连接又是什么? wensocket怎么实现呢? 他们都能实现web通讯,区别在哪呢,哪个好用呢? 接下来我们就一个个来了 ...
随机推荐
- 生成ico格式图标
ico格式可参考如下链接: http://msdn.microsoft.com/en-us/library/ms997538.aspx http://en.wikipedia.org/wiki/ICO ...
- SaeMysql操作示例
新浪sae的官方说明文档:http://apidoc.sinaapp.com/sae/SaeMysql.html Class SaeMysql 具体实现:http://apidoc.sinaapp.c ...
- Python 安装urllib3
一.系统环境 操作系统:Win10 64位 Python版本:Python 3.7.0 二.报错信息 No module named 'urllib3' 三.安装参考 1.参照网上的安装方法通过pip ...
- Openssl genpkey命令
一.简介 genpkey命令用于产生各种密钥(RSA.DSA.DH.EC等)的私钥值. 二.语法 openssl genpkey [-out filename] [-outform PEM | DER ...
- Maven——继承和聚合
实际项目中,可能正要构建一个大型的系统,但又不想一遍又一遍的重复同样的依赖元素,这种情况是经常出现的.不过还好,maven提供了继承机制,项目可以通过parent元素使用继承,可以避免这种重复.当一个 ...
- Mybatis_映射文件配置
获取自增主键的值 若数据库支持自动生成主键的字段(比如 MySQL 和 SQL Server),则可以设置 useGeneratedKeys=”true”,然后再把 keyProperty 设置到目标 ...
- Monkey压力测试Android常见的错误类型及黑白名单的使用方法
Android常见的错误类型有两种 1.ANR类型 1)在5秒内没有响应输入的事件(例如,按键按下,屏幕触摸) 2)BroadcastReceiver在10秒内没有执行完毕 2.Crash类型 1)异 ...
- HDU 2829 Lawrence (斜率优化DP或四边形不等式优化DP)
题意:给定 n 个数,要你将其分成m + 1组,要求每组数必须是连续的而且要求得到的价值最小.一组数的价值定义为该组内任意两个数乘积之和,如果某组中仅有一个数,那么该组数的价值为0. 析:DP状态方程 ...
- HttpUploader7-授权码配置
1.1. 七牛云存储 配置方式: 1.配置授权码 2.配置云存储 3.配置空间名称 4.配置上传地址 1.2. 阿里云存储 配置方式: 1.填写授权码 2.配置云存储为阿里云 ...
- SQL之DCL
DCL(Data Control Language)数据库控制语言 授权,角色控制等GRANT 授权REVOKE 取消授权 1)授权命令 grant,语法格式(SQL语句不区分大小写):Grant ...