tornado 之WebSocket

实时获取消息

前端轮询      有数据立即回复,没数据就回复没数据
长轮询         没有数据改变时不做任何响应
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>

index.py

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版权协议,转载请附上原文出处链接和本声明。