websocket

websocekt 協(xié)議

試想,如果要是想實(shí)現(xiàn)一個(gè)全站通知的功能,管理員在網(wǎng)站輸入一個(gè)通知消息,服務(wù)器接收
到這個(gè)管理員發(fā)送的消息,將這個(gè)消息來(lái)廣播出去。
傳統(tǒng)的實(shí)現(xiàn)方式是什么呢?
由于在http中 一個(gè)request 對(duì)應(yīng)一個(gè) response ,這個(gè)response是被動(dòng)的。

ajax輪訓(xùn), 或者 long poll
ajax輪訓(xùn)是客戶端每隔一段時(shí)間就向服務(wù)器發(fā)送一個(gè)請(qǐng)求,查看是否有新的通知消息。
是一種同步非阻塞的模型。

還有一種方式是long poll,如果沒有就一直等待,是一種阻塞的模型。

這兩種方式都是被動(dòng)的從服務(wù)端來(lái)獲取消息。這樣會(huì)浪費(fèi)很多的資源。

而websocket 能夠進(jìn)行主動(dòng)推送信息。經(jīng)過(guò)一次http握手就可以進(jìn)行。當(dāng)服務(wù)端有信息
時(shí)可以直接進(jìn)行推送。

 HTTP/1.1 101 Switching Protocols
 Upgrade: websocket
 Connection: Upgrade
 Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
 Sec-WebSocket-Protocol: chat

 Upgrade: websocket
 Connection: Upgrade

可以看到 這里首先來(lái)選擇協(xié)議,經(jīng)過(guò)http握手后變?yōu)榱藈ebsocket。
此時(shí)在瀏覽器中的抓包已經(jīng)看不到websocket 的協(xié)議的內(nèi)容了。

一個(gè)簡(jiǎn)單的demo

web服務(wù)

from flask import Flask, render_template
app = Flask(__name__)

@app.route('/')
def index():
    return render_template('socket.html')

if __name__ == '__main__':
    app.run(debug=True)

socketio服務(wù)

from aiohttp import web

import socketio

sio = socketio.AsyncServer(async_mode='aiohttp')
app = web.Application()
sio.attach(app)

@sio.on('my broadcast event', namespace='/test')
async def test_broadcast_message(sid, message):
    await sio.emit('my response', {'data':  message['data']}, namespace='/test')


if __name__ == '__main__':
    web.run_app(app, host='localhost', port=8000)

上面使用了asyncio 的異步模式,可以進(jìn)行大規(guī)模的鏈接。

socket.html
主要如下:
引入socketio 包,這個(gè)包可以在不支持websocket的瀏覽器上切換成其他方式

<script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.5/socket.io.min.js"></script>

實(shí)例化

var socket = io.connect('http://' + document.domain + ':' + port+ namespace);

接收消息
socket.on
發(fā)送消息
socket.emit

博客 https://www.97up.cn/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容