官方文檔: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