??????
哈嘍!大家好,我是【太陽打傘】,一位熱愛分享各種技術(shù)的博主!??????
?【太陽打傘】的創(chuàng)作宗旨:每一條命令都親自執(zhí)行過,每一行代碼都實(shí)際運(yùn)行過,每一種方法都真實(shí)實(shí)踐過,每一篇文章都良心制作過。???
?【太陽打傘】的博客中所有涉及命令、代碼的地方,除了提供圖片供大家參考,另外會(huì)在圖片下方提供一份純文本格式的命令或者代碼方便大家粘貼復(fù)制直接執(zhí)行命令或者運(yùn)行代碼。??????
?如果你對技術(shù)有著濃厚的興趣,歡迎關(guān)注【太陽打傘】,歡迎大家和我一起交流。??????
??????感謝各位朋友接下來的閱讀??????
?
1.簡介
WebSocket是一種在單個(gè)TCP連接上進(jìn)行全雙工通信的協(xié)議。WebSocket通信協(xié)議于2011年被IETF定為標(biāo)準(zhǔn)RFC 6455,并由RFC7936補(bǔ)充規(guī)范。WebSocket API也被W3C定為標(biāo)準(zhǔn)。
WebSocket使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡單,允許服務(wù)端主動(dòng)向客戶端推送數(shù)據(jù)。在WebSocket API中,瀏覽器和服務(wù)器只需要完成一次握手,兩者之間就直接可以創(chuàng)建持久性的連接,并進(jìn)行雙向數(shù)據(jù)傳輸。
?
2.特點(diǎn)
它的最大特點(diǎn)就是,服務(wù)器可以主動(dòng)向客戶端推送信息,客戶端也可以主動(dòng)向服務(wù)器發(fā)送信息,是真正的雙向平等對話,屬于服務(wù)器推送技術(shù)的一種。
- 較少的控制開銷
- 更強(qiáng)的實(shí)時(shí)性
- 保持連接狀態(tài)
- 更好的二進(jìn)制支持
- 可以支持?jǐn)U展
- 更好的壓縮效果
連接成功狀態(tài)碼
101:HTTP協(xié)議切換為WebSocket協(xié)議。
3.WebSocket事件
事件 | 事件處理程序 | 描述 |
open | Socket.onopen | 連接建立時(shí)觸發(fā) |
message | Socket.onmessage | 客戶端接收服務(wù)端數(shù)據(jù)時(shí)觸發(fā) |
error | Socket.onerror | 通信發(fā)生錯(cuò)誤時(shí)觸發(fā) |
close | Socket.onclose | 連接關(guān)閉時(shí)觸發(fā) |
4.WebSocket方法
方法 | 描述 |
---|---|
Socket.send() | 使用連接發(fā)送數(shù)據(jù) |
Socket.close() | 關(guān)閉連接 |
5.使用方法
(1).前端vue 3.0
根據(jù)token來建立鏈接信息,需要把當(dāng)前用戶的token傳到服務(wù)器
"token":localStorage.getItem("token"),
//聲明一個(gè)方法
init_websocket:function(){
//建立websocket鏈接
if("WebSocket" in window){
var ws = new WebSocket("ws://localhost:8000/websocket/?token=" + this.token);
ws.onopen = function(){
//web socket 已連接上,使用send()方法發(fā)送數(shù)據(jù)
console.log("建立鏈接");
ws.send("我是前端傳來的信息");
}
ws.onmessage = function(evt){
console.log(evt.data);
//反序列化
}
alert("數(shù)據(jù)已接收")
}
ws.onclose = function(){
//關(guān)閉websocket
console.log("鏈接關(guān)閉了")
}
}else{
alert("你的瀏覽器不支持websocket,請更換chrome")
}
}
(2).后端 tornado
1.導(dǎo)入需要使用的模塊:
from tornado.web import url
from functools import wraps
from tornado import websocket
from base import BaseHandler
import json
2.寫入視圖類:
clients = {}
async def push_message(uid,message):
# 查找發(fā)送的對象
if uid in clients:
print(uid,message)
clients[uid]["connect"].write_message(message)
class BaseWebSocket(websocket.WebSocketHandler):
def check_origin(self, origin):
"""重寫同源檢查 解決跨域問題"""
return True
# 開啟鏈接
# 進(jìn)行校驗(yàn)
@websocket_jwt
async def open(self):
global clients
# 存儲用戶鏈接
clients[self._cuser.id] = {"connect":self}
print(clients)
print("開啟鏈接")
# 接收消息
def on_message(self, message):
print(message)
# 斷開
@websocket_jwt
def on_close(self):
del clients[self.self._cuser.id]
print("鏈接斷開了")
class PushWebSocket(BaseHandler):
async def post(self):
uid = self.get_argument("uid")
await push_message(int(uid),"這是后端傳來的消息")
self.finish({"errcode":0,'msg':"消息推送成功"})
3.寫測試腳本文章來源:http://www.zghlxwxcb.cn/news/detail-414306.html
# token是前端用戶的token,已修改,記得用自己的哦
data = {'uid':16,"token":'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MTZ9.XvNppt0kbk9YdcWE2eT-OS6DZGiHfYLWWY5Qz_lSCpu'}
if __name__ == '__main__':
res = requests.post("http://localhost:8000/push/",data=data)
print(res.text)
4.配置路由文章來源地址http://www.zghlxwxcb.cn/news/detail-414306.html
# 聲明路由
urlpatterns = [
url('/websocket/', BaseWebSocket),
url('/push/', PushWebSocket),
]
到了這里,關(guān)于Python-Websocket的介紹及使用方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!