flask 实现 Websocket 服务器

要在 Flask 应用中实现 WebSocket 服务器,需要使用第三方插件 Flask-SocketIO。Flask-SocketIO 基于 Socket.IO,它提供了一个更高级的 WebSocket 实现,支持事件和命名空间。下面是一些简单的步骤来实现 Flask-SocketIO 的 WebSocket 服务器:

  1. 安装 Flask-SocketIO

    在命令行中输入以下命令:

    pip install flask-socketio
    
  2. 在 Flask 应用中初始化 Flask-SocketIO

    from flask import Flask
    from flask_socketio import SocketIO
    
    app = Flask(__name__)
    socketio = SocketIO(app)
    
  3. 定义事件处理程序

    @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') 是另一个事件处理程序,它会在客户端断开连接时被调用。在这些处理程序中,你可以执行任何操作,例如打印消息或向客户端发送事件。

  4. 启动 Flask-SocketIO 服务器

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

    这将启动 Flask-SocketIO 服务器,你可以在客户端使用 JavaScript 来连接它。

  5. 编写客户端代码

    在 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 事件将被调用,以及 messagedisconnect 事件将被调用。在点击 “Send” 按钮时,你会向服务器发送一条消息。

希望这个例子能帮助你实现自己的 Flask WebSocket 应用程序。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值