要在 Flask 应用中实现 WebSocket 服务器,需要使用第三方插件 Flask-SocketIO。Flask-SocketIO 基于 Socket.IO,它提供了一个更高级的 WebSocket 实现,支持事件和命名空间。下面是一些简单的步骤来实现 Flask-SocketIO 的 WebSocket 服务器:
-
安装 Flask-SocketIO
在命令行中输入以下命令:
pip install flask-socketio
-
在 Flask 应用中初始化 Flask-SocketIO
from flask import Flask from flask_socketio import SocketIO app = Flask(__name__) socketio = SocketIO(app)
-
定义事件处理程序
@socketio.on('connect') def handle_connect(): print('Client connected.') socketio.emit('my_event', {'data': 'Connected'}, namespace='/test') @socketio.on('disconnect') def handle_disconnect(): print('Client disconnected.')
在上面的示例中,
@socketio.on('connect')
是一个事件处理程序,它会在客户端连接到服务器时被调用。@socketio.on('disconnect')
是另一个事件处理程序,它会在客户端断开连接时被调用。在这些处理程序中,你可以执行任何操作,例如打印消息或向客户端发送事件。 -
启动 Flask-SocketIO 服务器
if __name__ == '__main__': socketio.run(app)
这将启动 Flask-SocketIO 服务器,你可以在客户端使用 JavaScript 来连接它。
-
编写客户端代码
在 JavaScript 中,使用 Socket.IO 客户端库来连接服务器并处理事件。在以下示例中,我们连接到
/test
命名空间并处理来自服务器的my_event
事件。<script src="//cdnjs.cloudflare.com/ajax/libs/socket.io/2.3.0/socket.io.js"></script> <script> var socket = io.connect('http://localhost:5000/test'); socket.on('connect', function() { console.log('Connected'); }); socket.on('my_event', function(data) { console.log(data); }); socket.on('disconnect', function() { console.log('Disconnected'); }); </script>
客户端代码使用
io.connect()
方法连接到服务器,socket.on()
方法处理来自服务器的事件。
以上是实现 Flask-SocketIO 的 WebSocket 服务器最简单的方法。你还可以使用命名空间、房间和自定义事件来扩展这个例子,以满足你的需求。
好的,下面是 Flask 实现 WebSocket 服务器的详细代码:
from flask import Flask, render_template
from flask_socketio import SocketIO, emit
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)
@app.route('/')
def index():
# 渲染模板
return render_template('index.html')
@socketio.on('connect')
def test_connect():
print('Client connected')
@socketio.on('disconnect')
def test_disconnect():
print('Client disconnected')
@socketio.on('message')
def handle_message(msg):
print('Received message: ' + msg)
emit('message', msg, broadcast=True)
if __name__ == '__main__':
socketio.run(app, debug=True)
在这个例子中,@socketio.on
装饰器用于处理 WebSocket 客户端发送的各种事件。
当客户端连接到服务器时,test_connect()
事件处理程序将被调用,并打印 ‘Client connected’。
当客户端断开连接时,test_disconnect()
事件处理程序将被调用,并打印’Client disconnected’。
当客户端发送消息时,handle_message()
事件处理程序将被调用,并打印接收到的消息。emit()
函数用于向所有已连接的客户端广播消息。
在你的 HTML 模板中,你可以使用以下代码来连接到服务器:
<!doctype html>
<html>
<head>
<title>Flask Websocket Example</title>
</head>
<body>
<script src="//cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.js"></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
var socket = io.connect('http://' + document.domain + ':' + location.port);
socket.on('connect', function() {
console.log('Connected');
});
socket.on('message', function(data) {
console.log(data);
});
socket.on('disconnect', function() {
console.log('Disconnected');
});
document.querySelector('#send_button').onclick = function() {
var message = document.querySelector('#message').value;
socket.send(message);
};
});
</script>
<h1>Flask Websocket Example</h1>
<input type="text" id="message">
<button type="button" id="send_button">Send</button>
</body>
</html>
在这个例子中,你可以使用 JavaScript 的 socket.io
客户端库创建一个 WebSocket 连接。在连接建立后,connect
事件将被调用,以及 message
和 disconnect
事件将被调用。在点击 “Send” 按钮时,你会向服务器发送一条消息。
希望这个例子能帮助你实现自己的 Flask WebSocket 应用程序。