Flask-SocketIO 是 Flask 的擴展,它提供了與客戶端進行實時雙向通信的功能。本文將從多個方面對 Flask-SocketIO 進行詳細闡述,包括自動發消息、單獨聊天、連接多個客戶端、坑點、多個主機、Vue 框架中使用 Flask-SocketIO、反應慢問題以及應用於客戶端伺服器架構等。
一、自動發消息
Flask-SocketIO 可以自動將消息推送給所有已連接的客戶端。需要使用 emit() 函數,並在客戶端打開 SocketIO 時,使用 socket.on() 函數來監聽消息。示例代碼如下:
from flask_socketio import SocketIO, emit
from flask import Flask, render_template
app = Flask(__name__)
app.config['SECRET_KEY'] = 'mysecret'
socketio = SocketIO(app)
@app.route('/')
def index():
return render_template('index.html')
@socketio.on('message')
def handle_message(msg):
emit('response', msg, broadcast=True)
if __name__ == '__main__':
socketio.run(app)
在客戶端中,需要使用 SocketIO 的 on() 函數監聽伺服器發送的消息,並使用 emit() 函數向伺服器發送消息。示例代碼如下:
var socket = io.connect('http://' + document.domain + ':' + location.port);
socket.on('response', function(msg) {
console.log('Got a message:', msg);
});
socket.emit('message', 'Hello, World!');
二、單獨聊天
除了向所有已連接的客戶端廣播消息之外,Flask-SocketIO 還支持單獨聊天功能,這就意味著伺服器和客戶端之間可以私密聊天。示例代碼如下:
@socketio.on('private_message')
def handle_private_message(msg):
emit('response', msg['message'], room=msg['room'], include_self=False)
@socketio.on('join')
def handle_join(room):
join_room(room)
emit('response', 'In rooms: ' + ', '.join(list(rooms())), room=room)
@socketio.on('leave')
def handle_leave(room):
leave_room(room)
emit('response', 'In rooms: ' + ', '.join(list(rooms())), room=room)
上面代碼中,handle_private_message() 函數接收一個帶有目標房間和消息的字典,使用 room 參數指定目標房間,使用 include_self 參數指定是否向自己推送消息。
除此之外,還有兩個監聽函數,handle_join() 和 handle_leave(),一個是加入房間,一個是離開房間。示例代碼如下:
socket.emit('join', room='room1');
socket.emit('private_message', { 'room': 'room1', 'message': 'hello' });
socket.emit('leave', room='room1');
三、連接多個客戶端
Flask-SocketIO 可以連接多個客戶端。需要使用 Connection() 函數,並在客戶端打開 SocketIO 時,使用 namespace 參數指定房間名稱。示例代碼如下:
from flask_socketio import SocketIO, Connection
from flask import Flask, render_template
app = Flask(__name__)
app.config['SECRET_KEY'] = 'mysecret'
socketio = SocketIO(app)
@app.route('/')
def index():
return render_template('index.html')
@socketio.on_namespace('/chat')
class ChatNamespace(Connection):
def on_connect(self):
print('Connected: ', self.sid)
def on_disconnect(self):
print('Disconnected: ', self.sid)
def on_message(self, data):
self.emit('response', 'You said: ' + data)
if __name__ == '__main__':
socketio.run(app)
在客戶端中,需要使用 io() 函數指定房間名稱,並使用 namespace 參數指定命名空間。示例代碼如下:
var socket = io('http://' + document.domain + ':' + location.port + '/chat');
socket.on('connect', function() {
console.log('Connected:', socket.id);
});
socket.on('disconnect', function() {
console.log('Disconnected:', socket.id);
});
socket.on('response', function(msg) {
console.log('Got a message:', msg);
});
socket.emit('message', 'Hello, World!');
四、Flask-SocketIO 的坑
使用 Flask-SocketIO 的過程中,可能會遇到一些坑,需要注意。比如說:
- 不能使用 Flask 的
request對象,而應該使用 Flask-SocketIO 提供的socketio對象,如:socketio.emit(‘response’, {‘data’: ‘your data’}, namespace=’/chat’) - 事件名稱要正確,不要拼寫錯誤或大小寫錯誤,事件名稱大小寫敏感。
- Vues.js 綁定事件時必須使用
v-on指令綁定,而不能使用@縮寫。
五、多個主機
Flask-SocketIO 允許多個主機之間進行實時通信。需要使用 emit() 函數,並在客戶端打開 SocketIO 時,使用 socketIO() 函數指定主機地址。示例代碼如下:
from flask_socketio import SocketIO, emit
from flask import Flask, render_template
app = Flask(__name__)
app.config['SECRET_KEY'] = 'mysecret'
socketio = SocketIO(app)
@app.route('/')
def index():
return render_template('index.html')
@socketio.on('message')
def handle_message(msg):
emit('response', msg, broadcast=True)
if __name__ == '__main__':
socketio.run(app, host='0.0.0.0', port=5000)
在客戶端中,需要使用 socketIO() 函數指定主機地址。示例代碼如下:
var socket = io.connect('http://192.168.1.100:5000');
六、Vue 框架中使用 Flask-SocketIO
在 Vue 框架中使用 Flask-SocketIO,需要先安裝 vue-socket.io 包,通過 $ npm install vue-socket.io --save 命令安裝。
接下來,在 main.js 中使用 Vue.use() 將其掛載到 Vue 實例中,然後在組件中使用 this.$socket.emit() 向伺服器發送消息,並使用 this.$socket.on() 函數監聽伺服器發送的消息。示例代碼如下:
import VueSocketIO from 'vue-socket.io';
import Vue from 'vue';
Vue.use(new VueSocketIO({
debug: true,
connection: 'http://localhost:5000',
}));
export default {
data() {
return {
message: '',
response: '',
}
},
mounted() {
this.$socket.on('response', (msg) => {
this.response = msg;
});
},
methods: {
sendMessage() {
this.$socket.emit('message', this.message);
this.message = '';
}
}
}
七、Flask-SocketIO 反應慢問題
在使用 Flask-SocketIO 過程中,如果出現反應慢的情況,可能是因為伺服器配置不夠,可以考慮使用非同步模式。
使用非同步模式需要使用 eventlet 包,並使用 monkey_patch() 函數進行補丁。示例代碼如下:
from flask_socketio import SocketIO, emit
from flask import Flask, render_template
import eventlet
app = Flask(__name__)
app.config['SECRET_KEY'] = 'mysecret'
socketio = SocketIO(app, async_mode='eventlet')
eventlet.monkey_patch()
@app.route('/')
def index():
return render_template('index.html')
@socketio.on('message')
def handle_message(msg):
emit('response', msg, broadcast=True)
if __name__ == '__main__':
socketio.run(app)
八、Flask-SocketIO 可以用於客戶端伺服器架構嗎
Flask-SocketIO 可以用於客戶端伺服器架構,可以幫助開發者搭建實時通信的系統。在服務端,使用 Flask-SocketIO 處理客戶端請求,將客戶端發送的消息實時推送到其他客戶端;在客戶端,使用 SocketIO 接受服務端的推送消息。
基於 Flask-SocketIO 的客戶端伺服器架構可以用於多個場景,比如聊天室、實時數據可視化等。
總結
本文從多個方面對 Flask-SocketIO 進行了詳細闡述,包括自動發消息、單獨聊天、連接多個客戶端、坑點、多個主機、Vue 框架中使用 Flask-SocketIO、反應慢問題以及應用於客戶端伺服器架構等。如果你對 Flask-SocketIO 還有不理解的地方,可以通過本文給出的示例代碼進行深入學習。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/189452.html
微信掃一掃
支付寶掃一掃