大家好,下面我和大家分享一下非诚勿扰tornado的实现方式。
非诚勿扰APK地址: http://as.baidu.com/a/item?docid=475931&f=web_alad_1
概念介绍:
Comet:基于HTTP长连接的“服务器推”技术
基于Comet的技术主要分为流(streaming)方式和长轮询(long-polling)方式。
首先看Comet这个单词,很多地方都会说到,它是“彗星”的意思,顾名思义,彗星有个长长的尾巴,以此来说明客户端发起的请求是长连的。即用户发起请求后就挂起,等待服务器返回数据,在此期间不会断开连接。流方式和长轮询方式的区别就是:对于流方式,客户端发起连接就不会断开连接,而是由服务器端进行控制。当服务器端有更新时,刷新数据,客户端进行更新;而对于长轮询,当服务器端有更新返回,客户端先断开连接,进行处理,然后重新发起连接。
长轮询(long-polling)方式
流(streaming)方式
根据上面两种方式,我使用了Streaming的方式,原因很简单,在移动互联网的网络环境不如互联网的网络环境,建立tcp链接的开销比较大,所以我们使用streaming方式,在客户端意外断开链接后进行重链接。
具体的实现,其实实现起来
class Chat(object):
"""Chat Redis Server"""
def __init__(self):
redis_settings = settings.redis_settings
config = redis_settings["REDIS_CHAT"]
self.redis = Redis(config["servers"], config["port"], config["db"])
def chat_list_key(self, from_user, to_user):
return "chat_messages:%s:%s" % (from_user.id, to_user.id)
def say(self, from_user, to_user, msg, img,sys='', urla="",urlb=""):
"""chat to some one"""
#add unread list
pipeline = self.redis.pipeline()
try:
#add msg to unread list
chat_list_name = self.chat_list_key(from_user, to_user)
pipeline.rpush(chat_list_name, msg)
pipeline.execute()
except:
pipeline.reset()
def read(self, from_user, to_user, count=20, set_read=True):
key = self.chat_list_key(from_user, to_user)
data = self.redis.lrange(key, 0, count) or []
if set_read:
pipeline = self.redis.pipeline()
try:
pipeline.delete(key)
pipeline.execute()
finally:
pipeline.reset()
return data
很简单,简单就是美吗:
cimport functools
import hashlib
import logging
import struct
import time
import tornado.escape
import tornado.web
from tornado import httpserver
import tornado.websocket
import random
class PollingHandler(tornado.web.RequestHandler):
def post(self):
num = random.randint(1, 100)
self.write("welcome:E" + str(num))
self.finish()
class StreamingHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
def post(self):
self.get_data(callback=self.on_finish)
def get_data(self, callback):
if self.request.connection.stream.closed():
return
num = random.randint(1, 100)
callback(num)
def on_finish(self, data):
self.write("Server says: %d" % data)
self.flush()
tornado.ioloop.IOLoop.instance().add_timeout(
time.time() + 3,
lambda: self.get_data(callback=self.on_finish)
)
class LongPollingHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
def post(self):
self.get_data(callback=self.on_finish)
def get_data(self, callback):
if self.request.connection.stream.closed():
return
num = random.randint(1, 100)
tornado.ioloop.IOLoop.instance().add_timeout(
time.time() + 3,
lambda: callback(num)
)
def on_finish(self, data):
self.write("Server says: %d" % data)
self.finish()
class WebSocketHandler(tornado.websocket.WebSocketHandler):
def open(self):
num = random.randint(1, 100)
self.write_message("Server Say:"+str(num))
def on_message(self, message):
logging.info("getting message %s", message)
self.write_message("You say:" + message)
def on_close(self):
print "[WebSocket closed]......"
if __name__ == "__main__":
application = tornado.web.Application([
(r"/websocket", WebSocketHandler),
(r"/polling", PollingHandler),
(r"/streaming", StreamingHandler),
(r"/longpolling", LongPollingHandler),
(r"/static/(.*)", tornado.web.StaticFileHandler, {"path": "/Users/liuzheng/py.work.dir/comet"}),
])
port = 8888
print "[start server on port:%s]......." % port
http_server = httpserver.HTTPServer(application)
http_server.bind(port)
http_server.start(2)
tornado.ioloop.IOLoop.instance().start()
WebSocket:未来方向
以上不管是Comet的何种方式,其实都只是单向通信,直到WebSocket的出现,才是B/S之间真正的全双工通信。不过目前WebSocket协议仍在开发中,目前Chrome和Safri浏览器默认支持WebSocket,而FF4和Opera出于安全考虑,默认关闭了WebSocket,IE则不支持(包括9),目前WebSocket协议最新的为“76号草案”。有兴趣可以关注http://dev.w3.org/html5/websockets/。
附件中有例子,有想完的朋友,拿去玩吧
分享到:
相关推荐
在全民编程的大环境下,学习编程的人与日俱增,而为开发者提供问答的社区也逐渐流行起来。例如,国外最著名技术问答社区 ...本章主要使用 Python中的轻量级异步框架 Tornado来实现一个类似 Stackoverflow的问答社区网站。
综上所述,这个项目结合了Vue3.0的前端能力、Tornado6.1的WebSocket支持和Redis的发布订阅模式,构建了一个高效的实时聊天系统。Vue3.0处理用户界面和状态管理,Tornado6.1作为实时通信服务器,而Redis则作为后台的...
Python高效开发实战+Django+Tornado+Flask+Twisted源代码 Python高效开发实战+Django+Tornado+Flask+Twisted源代码 Python高效开发实战+Django+Tornado+Flask+Twisted源代码
通过查看源代码,你可以深入了解其内部实现,包括连接管理、命令处理、错误处理等机制,这对于深入理解和定制Tornado-Redis功能非常有帮助。 总的来说,Tornado-Redis是Tornado框架下进行高效、异步Redis操作的重要...
资源分类:Python库 所属语言:Python 资源全名:tornado-redis-session-0.1.3.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
斗地主游戏,后端基于Python+Tornado+MySQL开发,前端 Phaser 引擎 **Dependencies** * Python3.8+ * Mysql5.7+ Quick Start ```shell cd doudizhu mysql --user=root -p pip3 install -r requirements.txt ...
tornado+django+nginx+mysql搭建网站.zip
通过Tornado,后端服务器可以执行SQL语句与数据库进行交互,实现数据的增删改查。 项目可能包含的架构设计: 1. 前端:Vue.js 负责构建用户界面,与后端通过Ajax或者Fetch API进行通信,实现数据的获取和提交。 2. ...
在“vue+Tornado+Nginx+Mysql”这样的架构中,Vue.js 负责构建用户友好的前端界面,与Tornado通过API进行交互。Tornado作为后端服务器,处理业务逻辑和数据操作,利用MySQL存储和检索数据。Nginx作为反向代理服务器...
【Tornado+vxWorks】是基于实时操作系统(RTOS)VxWorks的重要开发工具集,它由Wind River Systems公司提供,用于高效地构建和管理嵌入式系统。Tornado是一个集成开发环境(IDE),专为VxWorks设计,提供了完整的...
概念证明测试 PyReact + Tornado + Motor + Jinja2 + reactjs $ mkdir tornado_react && cd tornado_react $ virtualenv --no-site-packages -p python3.4 . $ source bin/activate $ git clone ...
在本资源中,"Python高效开发实战Django+Tornado+Flask+Twisted完整源代码" 提供了四个核心的Python Web框架——Django、Tornado、Flask和Twisted的实践应用示例,旨在帮助开发者提升开发效率。 1. Django:Django...
在这个“Python+tornado+mysql 测试学习项目”中,我们可以深入探索如何使用Python编程语言、Tornado Web框架和MySQL数据库来构建一个完整的Web应用程序。这是一个非常实用的学习资源,适合那些想要提升自己在Web...
最近在centos部署了一套python框架,总结如下。在32位机器上离线方式部署VMware10+Centos6.9+Openssh7.5+MySQL5.1+Python2.7+Tornado+SQLAlchemy,有问题请联系407169441@qq.com
毕业设计,基于Python+Tornado+MySql开发的BBS问答社区,含完整源代码,数据库脚本,项目文档 《BBS问答社区》程序使用说明 在虚拟环境中运行命令“python manage.py run”启动项目。启动成功后,在浏览器中输入...
### 认识Tornado II与VxWorks:深入解析嵌入式系统开发工具与实时操作系统 #### 一、VxWorks:嵌入式系统的实时操作系统 VxWorks是一款由Wind River Systems开发的嵌入式实时操作系统(RTOS),以其高可靠性和高...
龙卷风重演基于Redis的服务器端会话中间件安装pip install tornado-redis-session用法 from tornado . httpserver import HTTPServerfrom tornado . ioloop import IOLoopfrom tornado . web import authenticated ,...