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的更多相关文章

  1. Tornado长轮询和WebSocket

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

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

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

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

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

  4. python之轮询、长轮询、websocket

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

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

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

  6. 轮询、长轮询和websocket

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

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

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

  8. 1.轮询、长轮询、websocket简介

    一.轮询 前端每隔固定时间向后台发送一次请求,询问服务器是否有新数据   缺点: 延迟,需要固定的轮询时间,不一定是实时数据 大量耗费服务器内存和宽带资源,因为不停的请求服务器,很多时候 并没有新的数 ...

  9. 10分钟学会web通讯的四种方式,短轮询、长轮询(comet)、长连接(SSE)、WebSocket

    一般看到标题我们一般会产生下面几个问题??? 什么是短轮询? 什么是长轮询? 长连接又是什么? wensocket怎么实现呢? 他们都能实现web通讯,区别在哪呢,哪个好用呢? 接下来我们就一个个来了 ...

随机推荐

  1. sql2012新的系统函数&分析函数

    一 .系统函数 1.字符串类函数:不用判断类型和NULL的字符串连接CONCAT函数 SQL Server本来对字符串的连接很简单,直接使用“+”号,但是需要注意两个问题,一是必须类型都是字符串类型, ...

  2. java基础之JDBC八:Druid连接池的使用

    基本使用代码: /** * Druid连接池及简单工具类的使用 */ public class Test{ public static void main(String[] args) { Conne ...

  3. 值得一做》一道类似于货车运输的题目(BZOJ3732)(easy+)

    这是一道模板套模板的题目,只要会LCA和最小生成树就可以做,水题 直接先甩题目 Description 给你N个点的无向图 (1 <= N <= 15,000),记为:1…N. 图中有M条 ...

  4. mfs权威指南

    1. 我在性能测试中间遇到些问题,因为我时间有限,所以希望大家一起来测试解决,群策群力.有什么问题请大家及时指出来,因为我也处在一个不断摸索的阶段. 2. mfs不多做介绍,具体细节请参考本版mfs实 ...

  5. cocos2d-x 在vs2010下的环境配置

    cocos2d-x编译完成之后生成了一堆动态库,在window下分别为.dll , .lib ,其中*lib是在编译的时候需要链接的,*.dll是在运行的时候依赖的.所以当我们创建一个cocos2d- ...

  6. java 从jsp页面传集合给controller

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...

  7. Luogu 1379 八数码难题

    吐槽:此题就是一点一点卡过去的 警告: 1.千万不能用dfs搜这种东西(dfs需要遍历所有状态才能找到最优解), 分分钟爆炸 2.写结构体的时候要综合判断&的加和不加 Code: // luo ...

  8. python3--生成器并行运算

    # Auther: Aaron Fan """def consumer(name): print("%s 准备吃包子啦!" % name) while ...

  9. 使用rpmbuild打包时不对文件进行strip操作

    使用rpmbuild打包时不对文件进行strip操作 摘自: https://www.ichenfu.com/2017/11/20/rpmbuild-not-strip/ By Chen Fu 发表于 ...

  10. 【未整理】web.xml加载顺序.RP

    一 1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Ser ...