实时获取消息
前端轮询 有数据立即回复,没数据就回复没数据
长轮询 没有数据改变时不做任何响应
WebSocket
概述
WebSocket是HTML5规范中提出新的客户端-服务器通信协议,该协议本身使用新的ws://url
WebSocket是独立的、创建在TCP协议之上的协议,和HTTP的唯一的关系是使用了HTTP协议的101状态码进行协议切换。使用TCP的默认端口80,可以绕过大多数防火墙
WebSocket使客户端与服务端之间的数据交互变得更加简单,允许服务器直接向客户端推送数据而不需要客户端的请求。两者可以建立持久链接,并且数据可以双向通信
目前大多数主流浏览器都已经支持WebSocket
Tornado的WebSocket模块
WebSocketHandle 处理通信
open() 当一个WebSocket链接建立后被调用
on_message(message) 当客户端发送消息过来时调用
on_close() 当WebSocket链接关闭后调用
write_message(message, binary=False) 主动向客户端发送message消息,message可以是字符串或者字典(自动转为Json字符串)。如果binary为False,则message会以UT-8编码发送。如果为True,可以发送二进制模式,字节码。
close() 关闭WebSocket链接
check_origin(origin) 判断源origin,对于符合条件的请求源允许连接
qq群聊
home.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>聊天界面</title>
<script type="text/javascript" charset="UTF-8" src="{{static_url('js/jquery.min.js')}}"></script>
</head>
<body>
<div id="contents" style="width: 500px;height: 500px;overflow: auto"></div>
<div>
<input type="text" id="message" />
<button onclick="sendMessage()">发送</button>
</div>
<script>
//建立WebSocket链接
var ws = new WebSocket('ws://192.168.213.128:9001/chat');
//接收服务器消息
ws.onmessage = function (e) {
$('#contents').append("<p>"+e.data+"</p>")
};
//向服务器发送消息
function sendMessage() {
// console.log('*************')
var message = $('#message').val();
ws.send(message);
$('#message').val("")
}
</script>
</body>
</html>
import tornado.web
from tornado.web import RequestHandler
from tornado.httpclient import AsyncHTTPClient #异步的http请求客户端
import time
import json
from tornado.websocket import WebSocketHandler
class StaticHandler(tornado.web.StaticFileHandler):
def __init__(self,*args,**kwargs):
super(StaticHandler,self).__init__(*args,**kwargs)
self.xsrf_token
class HomeHandler(RequestHandler):
def get(self, *args, **kwargs):
self.render('home.html')
class ChatHandler(WebSocketHandler):
users = [] #存储每一个人的信息
#连接建立后被调用
def open(self): #客户端建立链接后调用open
#链接上后在进行存储用户信息
self.users.append(self) #self 为每个连接服务器的客户端的对象
# print(self.users)
for user in self.users:
print(self.request.remote_ip)
user.write_message('u[{}]登陆了'.format(self.request.remote_ip)) #主动向客户端发送message消息,message可以是字符串或者字典,
def on_message(self, message): #客户端发送消息过来时服务器调用on_message
for user in self.users:
user.write_message(u'{}说:{}'.format(self.request.remote_ip,message)) #write_message的消息会被前端ws.onmessage方法接收
def on_close(self): #客户端断开链接调用on_close
self.users.remove(self)
for user in self.users:
print(user)
user.write_message('u[{}]退出登陆了'.format(self.request.remote_ip))
def check_origin(self, origin): #判断源origin,对于符合条件的请求源允许链接
return True
版权声明:本文为gz18511448437原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。