flask二十五: websocket


官方文檔:https://flask-socketio.readthedocs.io/en/latest/

websocket主要應用於客戶端和服務端雙向通信,永久的雙向通信通道。

任何一個都可以啟動交換。 一旦建立,連接一直有效,直到其中一方斷開連接。

前端

使用socket.io.min.js是node.js的一個websocket庫,首先創建socket. emit是向后端發送消息, message是該條消息的名稱,后面是發送消息的數據。on是注冊接受消息的事件,獲取后端傳過來的數據. namespace是指一類的消息。當連接成功時,會觸發connect事件,連接關閉時,觸發disconnect事件。

<html>
    <head>
        <script type="text/javascript"
        src="https://code.jquery.com/jquery-3.4.0.min.js"></script>
        <script type="text/javascript"
        src="//cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.6/socket.io.min.js"></script>
        
        <script type="text/javascript" charset="utf-8">
            $(document).ready(function () {
                namespace = "/wechat"
                var socket = io.connect('http://' + document.domain + ':' + location.port + namespace);
                
                socket.emit("message", { "data": "zhangsan" })
                
                socket.on('connect', function (data) {
                    socket.emit('message', { 'data': 'I\'m connected!' });
                });
                
                socket.on('disconnect', function(data){
                    socket.emit('message', { 'data': 'I\'m disconnected!' });
                });
                    
                socket.on('response', function (data) {
                    console.log(data.age)
                });
            });
        </script>
    </head>
    
    <body>
        <h1>德瑪西亞</h1>
    </body>
</html>

 

后端

 Flask-SocketIO,使Flask應用程序可以訪問客戶端和服務器之間的低延遲雙向通信。

安裝:pip install flask-socketio

send 和 emit區別
send發送的是無命名的數據,而emit是發送有命名的數據,個人建議是emit

簡單使用
on是注冊接收前端消息的方法,message是指接收的信息的名稱,和前端對應。namespace是指一類的消息,和前端對應。emit是指向前端發送消息,對應的消息的名稱、數據和namespace。

默認的兩個事件,connect和disconnect,當websocket連接成功和失敗時,自動觸發這兩個事件。

from flask import Flask, render_template
from flask_socketio import SocketIO

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)

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

@socketio.on('message', namespace="/wechat")
def handle_message(message):
    print('received message: ' + message['data'])
    socketio.emit("response", {'age': 18}, namespace="/wechat")

@socketio.on('connect', namespace="/wechat")
def connect():
    print("connect..")

@socketio.on('disconnect', namespace="/wechat")
def connect():
    print("disconnect...")

if __name__ == '__main__':
    socketio.run(app, port=8080)

基於類的使用

上面都是基於方法使用,個人感覺如果操作較多的情況,比較凌亂,使用類去管理會整齊和方便很多。

服務器收到的任何事件都會被分配到一個名為帶有on_前綴的事件名稱的方法。

這個案例和上面基於方法是一樣的,但是更加方便管理了,每個class管理一個namespace。

class MyCustomNamespace(Namespace):

    def on_connect(self):
        print("連接..")
        
    def on_disconnect(self):
        print("關閉連接")
        
    def on_message(self, data):
        print('received message: ' + data['data'])
        self.emit("response", {'age': 18})
    
socketio.on_namespace(MyCustomNamespace("/wechat"))

 


鏈接:https://blog.csdn.net/qq_22918243/java/article/details/89449850

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM