1. 程式人生 > >tornado 之WebSocket

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>
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