龙空技术网

基于 Python 的 Flask-SocketIO 框架 实现一个聊天系统

richardd 110

前言:

现时姐妹们对“jquerysocketio”大概比较关切,我们都想要分析一些“jquerysocketio”的相关知识。那么小编在网络上网罗了一些有关“jquerysocketio””的相关知识,希望咱们能喜欢,我们一起来了解一下吧!

Flask-SocketIO 是一个基于 Flask 和 Socket.IO 的 Python Web 应用程序开发库。它使得在 Flask 应用中使用实时 Web 功能变得非常容易。

Socket.IO 是一个 JavaScript 库,它允许双向实时通信。它基于 WebSockets,但是也提供了向后兼容的轮询等技术,以支持所有 Web 浏览器。

Flask-SocketIO 提供了许多有用的功能,例如:

基于事件的消息通信,可以向特定的客户端或所有客户端广播消息基于 Flask 视图的 Socket.IO 端点Flask-SocketIO 集成了 Werkzeug 的 HTTP 基础设施,这使得使用 Flask-SocketIO 的应用程序具有很高的性能和可扩展性

下面是一个使用 Flask-SocketIO 的简单示例:

pythonCopy codefrom flask import Flaskfrom flask_socketio import SocketIO, emitapp = Flask(__name__)app.config['SECRET_KEY'] = 'secret!'socketio = SocketIO(app)@socketio.on('connect')def handle_connect():    print('client connected')@socketio.on('message')def handle_message(data):    print('received message:', data)    emit('response', 'hello from server')if __name__ == '__main__':    socketio.run(app)

在客户端连接到服务器时,会自动触发 connect 事件。通过 on 方法注册事件处理函数,可以在服务器端处理客户端发送的事件。使用 emit 方法可以向客户端发送消息。

在客户端使用 JavaScript 来处理事件,示例如下:

javascriptCopy codevar socket = io.connect(';);socket.on('connect', function() {    console.log('connected to server');});socket.on('response', function(data) {    console.log('received response:', data);});socket.emit('message', 'hello from client');

在客户端连接到服务器时,会自动触发 connect 事件。使用 on 方法注册事件处理函数,可以在客户端处理服务器发送的事件。使用 emit 方法可以向服务器发送消息。

使用 Flask-SocketIO 可以轻松地实现实时 Web 功能。与 Flask-SocketIO 一起使用的 Socket.IO 还提供了许多其他功能,例如房间、命名空间等。

下面是一个简单的聊天室示例,使用 Flask-SocketIO 实现。

server.py:

pythonCopy codefrom flask import Flask, render_templatefrom flask_socketio import SocketIO, emitapp = Flask(__name__)app.config['SECRET_KEY'] = 'secret!'socketio = SocketIO(app)# 保存在线用户online_users = set()@app.route('/')def index():    return render_template('index.html')# 接收客户端发送的消息@socketio.on('message')def handle_message(data):    emit('broadcast', data, broadcast=True)# 用户上线@socketio.on('login')def handle_login(username):    # 将用户添加到在线用户集合    online_users.add(username)    emit('user_list', list(online_users), broadcast=True)    emit('broadcast', f'{username} has joined the chat', broadcast=True)# 用户下线@socketio.on('logout')def handle_logout(username):    # 将用户从在线用户集合中移除    online_users.remove(username)    emit('user_list', list(online_users), broadcast=True)    emit('broadcast', f'{username} has left the chat', broadcast=True)if __name__ == '__main__':    socketio.run(app)

templates/index.html:

templates/index.html:

htmlCopy code<!doctype html><html>  <head>    <title>Chat Room</title>    <script src="; integrity="sha384-+7Vh13f86uA7bflvRj83M7hPG/E17FtwupV7q3Un19/0VfYQOxFh/7xNcE0RIs1" crossorigin="anonymous"></script>    <script src="//code.jquery.com/jquery-3.6.0.min.js"></script>  </head>  <body>    <h1>Chat Room</h1>    <div id="message-list"></div>    <div>      <input type="text" id="username" placeholder="Your Name">      <button id="login-btn">Login</button>      <button id="logout-btn" disabled>Logout</button>    </div>    <div>      <input type="text" id="message" placeholder="Your Message">      <button id="send-btn" disabled>Send</button>    </div>    <div id="user-list"></div>    <script>      $(function() {        var socket = io();        var username = '';        // 显示在线用户列表        function showUserList(users) {          var html = '<h3>Online Users:</h3><ul>';          users.forEach(function(user) {            html += '<li>' + user + '</li>';          });          html += '</ul>';          $('#user-list').html(html);        }        // 显示聊天记录        function showMessageList(message) {          $('#message-list').append($('<p>').text(message));        }        // 登录按钮事件处理函数        $('#login-btn').click(function() {          username = $('#username').val();          socket.emit('login', username);          $('#username').val('');          $('#username').attr('disabled', 'disabled');          $('#login-btn').attr('disabled', 'disabled');          $('#logout-btn').removeAttr('disabled');          $('#send-btn').removeAttr('disabled');        });        // 登出按钮事件处理函数        $('#logout-btn').click(function() {          socket.emit('logout', username);          $('#message-list'). empty();          $('#username').removeAttr('disabled');          $('#login-btn').removeAttr('disabled');          $('#logout-btn').attr('disabled', 'disabled');          $('#send-btn').attr('disabled', 'disabled');          username = '';        });        // 发送消息按钮事件处理函数        $('#send-btn').click(function() {          var message = $('#message').val();          socket.emit('message', '[' + username + '] ' + message);          $('#message').val('');        });        // 显示在线用户列表        socket.on('user_list', function(users) {          showUserList(users);        });        // 显示聊天记录        socket.on('broadcast', function(message) {          showMessageList(message);        });      });    </script>  </body></html>

在终端中运行 python server.py 启动服务端,然后在浏览器中访问 即可进入聊天室。

该示例中,通过 emit 方法向客户端发送消息,通过 on 方法接收客户端发送的消息。broadcast 参数表示将消息广播给所有客户端。

此外,还通过 online_users 集合保存在线用户列表,并在用户登录、登出时更新用户列表。

标签: #jquerysocketio