tornado 之WebSocket
阿新 • • 發佈:2018-12-10
實時獲取訊息
前端輪詢 有資料立即回覆,沒資料就回覆沒資料
長輪詢 沒有資料改變時不做任何響應
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