Tornado websocket应用
应用场景
WebSocket 的特点如下
- 适合服务器主动推送的场景(好友上线,即时聊天信息,火灾警告,股票涨停等)
- 相对于Ajax和Long poll等轮询技术,它更高效,不耗费网络带宽和计算资源
- 它仍然与HTTP完成网络通信
- 不受企业防火墙拦截
通信原理
1.WebSocket 客户端连接报文
GET /webfin/websocket/ HTTP/1.1
Host: localhost
Upgrade: websocket # 建立webSocket链接
Connection: Upgrade # 建立链接
Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg== # 密钥
Origin: <a href="http://localhost/"><code>http://localhost</code></a>:8080
Sec-WebSocket-Version: 13 # 版本是13
客户端发起的 WebSocket 连接报文类似传统 HTTP 报文,”Upgrade:websocket”参数值表明这是 WebSocket 类型请求,“Sec-WebSocket-Key”是 WebSocket 客户端发送的一个 base64 编码的密文,要求服务端必须返回一个对应加密的“Sec-WebSocket-Accept”应答,否则客户端会抛出“Error during WebSocket handshake”错误,并关闭连接。
2、服务端收到报文后返回的数据格式类似:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: K7DJLdLooIwIG/MOpvWFB3y3FE8=
“Sec-WebSocket-Accept”的值是服务端采用与客户端一致的密钥计算出来后返回客户端的,“HTTP/1.1 101 Switching Protocols”表示服务端接受 WebSocket 协议的客户端连接,经过这样的请求-响应处理后,客户端服务端的 WebSocket 连接握手成功, 后续就可以进行 TCP 通讯了
服务端编程:
tornadowebsocokt入口函数,需要继承tornado.websocket.WebSocketHandler,并显现open(),on_message(),on_close()函数
还提供了开发者主动操作的websocket函数
WebSocketHandler.write_meassage(message,binary=False) 用于向本链接对应的客户端写消息
WebSocketHandler.close(code=None,reason=None)函数:主动关闭链接,并告知客户端关闭的原因,code参数必须是一个数值,reason必须是一个字符串
实例
import tornado.web
import tornado.ioloop
import tornado.websocket from tornado.options import define,options,parse_command_line define('port',default=8888,help='run the given port',type=int) clients = dict() # 客户端session字典 class IndexHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
def get(self):
self.render('index.html') class MyWebSocketHandler(tornado.websocket.WebSocketHandler):
def open(self, *args): # 有新连接时被调用
self.id = self.get_argument('Id')
self.stream.set_nodelay(True)
clients[self.id]={"id":self.id,"object":self} # 保存session到clients字典中 def on_message(self, message): # 收到消息时被调用
print("client %s received a message : %s" % (self.id,message)) def on_close(self): # 关闭链接时被调用
if self.id in clients:
del clients[self.id]
print("client %s is closed" % (self.id)) def check_origin(self, origin):
return True app = tornado.web.Application([(r'/', IndexHandler), (r'/websocket', MyWebSocketHandler), ]) import threading
import time # 启动单独的线程运行此函数,每隔1秒向所有客户端推送当前时间
def sendTime():
import datetime
while True:
for key in clients.keys():
msg = str(datetime.datetime.now())
clients[key]['object'].write_message(msg) # 通过WebSocketHandler.write_meassage函数推送时间消息
print("write to client %s : %s" % (key,msg))
time.sleep(1) if __name__ == '__main__':
threading.Thread(target=sendTime).start() # 启动推送时间线程
parse_command_line()
app.listen(options.port)
tornado.ioloop.IOLoop.instance().start() # 挂起运行
客户端编程
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a href="javascript:WebSocketTest()">run websocket</a>
<div id="messages" style="height: 200px;background: black;color: #e0e0e0;"></div> <script type="text/javascript">
var messageContainer = document.getElementById('messages');
function WebSocketTest() {
if ("WebSocket" in window){
messageContainer.innerHTML = '你的浏览器支持websocket';
var ws = new WebSocket('ws://localhost:8888/websocket?Id=12345');
ws.onopen = function () {
ws.send("message to send");
};
ws.onmessage = function (evt) {
var received_msg = evt.data;
messageContainer.innerHTML = messageContainer.innerHTML+"<br/>message is received:"+received_msg;
};
ws.onclose = function () {
messageContainer.innerHTML = messageContainer.innerHTML+"<br/>链接已经关闭";
}; } else {
messageContainer.innerHTML = '你的浏览器不支持websocket';
}
}
</script>
</body>
</html>


Tornado websocket应用的更多相关文章
- python tornado websocket 实时日志展示
一.主题:实时展示服务器端动态生成的日志文件 二.流程: 1. 客户端浏览器与服务器建立websocket 链接,服务器挂起保存链接实例,等待新内容触发返回动作 2. 日志服务器脚本循环去发现新内容, ...
- python tornado websocket 多聊天室(返回消息给部分连接者)
python tornado 构建多个聊天室, 多个聊天室之间相互独立, 实现服务器端将消息返回给相应的部分客户端! chatHome.py // 服务器端, 渲染主页 --> 聊天室建立web ...
- [tornado]websocket 最简单demo
想法 前两天想看看django 长轮询或者是websocket的方案,发现都不太好使. tornado很适合做这个工作,于是找了些资料,参照了做了个最简单demo,以便备用. 具体的概念就不说了,to ...
- tornado websocket聊天室
1.app.py #!/usr/bin/env python # -*- coding:utf-8 -*- import uuid import json import tornado.ioloop ...
- tornado WebSocket详解
1.什么是WebSocketwebsocket和长轮询的区别是客户端和服务器之间是持久连接的双向通信.协议使用ws://URL格式,但它在是在标准HTTP上实现的. 2.tornado的WebSock ...
- nginx,tornado,websocket,supervisord配置成型
因为要上生产环境,所以配置还是专业一些比较好. nginx.conf upstream websocket_host { server 127.0.0.1:9527; } location /ws_l ...
- Tornado WebSocket简单聊天
Tornado实现了对socket的封装:tornado.web.RequestHandler 工程目录: 1.主程序 manage.py import tornado.web import torn ...
- tornado+websocket+mongodb实现在线视屏文字聊天
最近学了tornado和mongo,所以结合websocket 实现一个聊天功能,从而加深一下相关知识点的印象 1.websocket概览 webscoket是一种全双工通信模式的协议,客户端连接服务 ...
- websocket 与 tornado 的结合
对于socket是不陌生的,但是对于websocket我却是陌生的,不同于https,在网页中使用websocket可以同样起到ajax的作用,默默发送数据... 在script中: ws = new ...
随机推荐
- 结合实例分析Android MVP的实现
最近阅读项目的源码,发现项目中有MVP的痕迹,但是自己却不能很好地理解相关的代码实现逻辑.主要原因是自己对于MVP的理解过于概念话,还没有真正操作过.本文打算分析一个MVP的简单实例,帮助自己更好的理 ...
- HDU4812
树分治 求逆元请递推,不然会TLE 开桶记录即可 注意常数 # pragma comment(linker,"/STACK:102400000,102400000") # incl ...
- [BZOJ3110] [Zjoi2013] K大数查询 (树套树)
Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置 ...
- python 想搞加密算法吗?快戳这里
加密算法介绍 一,HASH Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列算法,变换 ...
- 解决Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project autotest_fchtgl: Compilation failure的方法
在碰到maven install 发现报错 Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.2:comp ...
- 【MyBatis源码分析】Configuration加载(上篇)
config.xml解析为org.w3c.dom.Document 本文首先来简单看一下MyBatis中将config.xml解析为org.w3c.dom.Document的流程,代码为上文的这部分: ...
- PHP接收android传过来的图片
在android手机app上,上传图片,PHP服务端接收图片需要一下步骤 1 需要android 开发人员 把图片转成base64格式 2 PHP端接收转化后的base64字符串,然后进行转译 fun ...
- 关系型数据库工作原理-查询优化器(翻译自Coding-Geek文章)
本文翻译自Coding-Geek文章:< How does a relational database work>.原文链接:http://coding-geek.com/how-data ...
- Spring MVC执行流程
SpringMVC是隶属于Spring Web中的一部分, 属于表现层的框架. 其使用了MVC架构模式的思想, 将Web层进行职责解耦, 使用请求-响应模型简化Web开发 SpringMVC通过中央调 ...
- jquery pjax 用法总结
以前我们点击a链接的时候总是会刷新整个页面并跳转到新页面,中间可以很明显的看到短暂的白屏.pjax就很好的解决了这问题. pjax的原理很简单,就是发送一个ajax请求,获取html代码,再把相关代码 ...