跟ChatGPT学Flask网络编程 (7)— SocketIO

Socket.IO 是一个实时、双向、基于事件的通信库,可以让应用程序实时地通信。它支持实时的客户端/服务器通信,可以在不同的客户端之间实时地广播和交换数据。Socket.IO 可以使用多种协议,如 WebSocket、HTTP、TCP 等,以提供最佳的性能和稳定性。使用 Socket.IO,可以实现以下功能:

  • 实时聊天:可以实时发送和接收消息,支持群聊和私聊等功能。
  • 实时协作:多个用户可以同时协作编辑一个文档,实时更新文档的内容。
  • 实时游戏:可以实现多人在线游戏,支持实时交互和实时数据传输。
  • 实时数据可视化:可以实时更新数据,并将数据可视化展示给用户。
  • 实时监控:可以实时监控系统的状态,并及时通知管理员。

:写一个简单的flask socket IO程序,用户在客户端网页对话框中输入文本,会被显示到网页上

ChatGPT:好的,下面是一个简单的 Flask SocketIO 程序,其中用户在客户端网页的文本框中输入文本,然后将文本实时显示在网页上。

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('message')
def handle_message(message):
    print('received message: ' + message)
    emit('message', message, broadcast=True)

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

在这个例子中,用户访问根路由时会显示一个 HTML 模板 index.html。在该模板中,有一个输入框和一个按钮,用户可以在输入框中输入文本并通过按钮将其发送给服务器。

<!DOCTYPE html>
<html>
  <head>
    <title>Flask SocketIO Chat Example</title>
    <script src="https://cdn.socket.io/socket.io-1.4.5.js"></script>
    <script src="//code.jquery.com/jquery-1.11.1.js"></script>
    <script type="text/javascript" charset="utf-8">
      $(document).ready(function() {
        var socket = io.connect('http://' + document.domain + ':' + location.port);

        socket.on('connect', function() {
          socket.send('User has connected!');
        });

        socket.on('message', function(msg) {
          $('#messages').append('<li>' + msg + '</li>');
        });

        $('form#message').submit(function(event) {
          socket.send($('input[name="message"]').val());
          $('input[name="message"]').val('');
          event.preventDefault();
        });
      });
</script>
  </head>
  <body>
    <ul id="messages"></ul>
    <form id="message">
      <input name="message" type="text" />
      <input type="submit" value="Send" />
    </form>
  </body>
</html>

在客户端 JavaScript 中,我们连接到服务器并在连接建立时发送一条消息。当从服务器接收到消息时,我们将其添加到一个无序列表中以在网页上显示。socketio.on() 装饰器用于指定当接收到名为 message 的 SocketIO 事件时调用的处理函数。在这个例子中,处理函数仅仅将接收到的消息打印到控制台,然后通过 emit() 函数将消息广播给所有客户端。这意味着所有已连接的客户端将收到消息,包括发送者本身。最后,通过运行 socketio.run(app) 启动服务器。

:逐行解释一下上面的代码

ChatGPT:好的,下面逐行解释一下 Flask SocketIO 的示例代码:

from flask import Flask, render_template
from flask_socketio import SocketIO, emit

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)

首先,我们导入必要的 Flask 和 Flask SocketIO 模块。然后,我们创建一个 Flask 应用实例和一个 SocketIO 实例。app.config[‘SECRET_KEY’] 用于设置应用的秘钥,以确保安全性。

@app.route('/')
def index():
    return render_template('index.html')

接下来,我们定义一个路由处理函数,当用户访问根路径时,返回一个名为 index.html 的 HTML 模板。

@socketio.on('message')
def handle_message(message):
    print('received message: ' + message)
    emit('message', message, broadcast=True)

我们使用 @socketio.on() 装饰器将 handle_message() 函数注册为处理 message 事件的处理函数。当有客户端发送一个 message 事件时,服务器会调用这个函数,并且将事件消息作为参数传递给它。在本例中,handle_message() 函数将收到的消息打印到控制台,然后使用 emit() 函数将消息广播给所有连接到服务器的客户端。

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

最后,我们使用 if __name__ == ‘__main__’ 来确保只有在直接运行这个 Python 脚本时才会运行服务器。通过调用 socketio.run(app) 来启动 Flask SocketIO 服务器。

:解释一下index.html中的代码ChatGPT:好的,下面逐行解释一下 index.html 文件中的代码:<title> 元素定义了网页的标题,显示在浏览器标签页上。

<script src="https://cdn.socket.io/socket.io-1.4.5.js"></script>
<script src="//code.jquery.com/jquery-1.11.1.js"></script>

这两行代码分别导入了 SocketIO 客户端库和 jQuery 库。

<script type="text/javascript" charset="utf-8">

这一行定义了 JavaScript 代码块,并设置了它的编码格式。

$(document).ready(function() {

这行代码表示当文档准备就绪时,执行下面的 JavaScript 代码。

var socket = io.connect('http://' + document.domain + ':' + location.port);

这一行代码创建了一个 SocketIO 连接,并将其赋给变量 socket。连接 URL 格式为 http://:,其中 hostname 是服务器的主机名,port 是端口号。在这里,我们使用 document.domain 获取当前网页的主机名,location.port 获取当前网页的端口号。

socket.on('connect', function() {
  socket.send('User has connected!');
});

这一行代码监听了 connect 事件,并在连接成功后发送了一条消息。可以使用 socket.emit() 函数代替 socket.send() 来发送指定事件类型的消息。

socket.on('message', function(msg) {
  $('#messages').append('<li>' + msg + '</li>');
});

这一行代码监听了 message 事件,并在接收到消息时将其添加到无序列表 messages 中。

$('form#message').submit(function(event) {
  socket.send($('input[name="message"]').val());
  $('input[name="message"]').val('');
  event.preventDefault();
});

这一行代码监听了表单的 submit 事件,并在表单被提交时将输入框中的文本发送给服务器。然后,将输入框的值设置为空,并使用event.preventDefault() 阻止了表单的默认提交行为,这样我们就可以使用 JavaScript 代码处理表单提交事件了。

<ul id="messages"></ul>

这一行代码定义了一个无序列表 messages,用于显示聊天记录。

<form id="message">
  <input name="message" type="text" />
  <input type="submit" value="Send" />
</form><code><form id="message"> <input name="message" type="text" /> <input type="submit" value="Send" /></form></code>

这一行代码定义了一个表单,包含一个输入框和一个提交按钮。输入框的名称为 message,类型为 text,用于输入聊天消息。提交按钮的类型为 submit,点击后将表单提交给服务器。表单的名称为 message,与上面的 JavaScript 代码中的选择器匹配,用于监听表单的提交事件。以上就是 index.html 文件中的代码解释。总的来说,这个网页包含了一个表单,用于输入聊天消息,以及一个无序列表,用于显示聊天记录。JavaScript 代码使用 SocketIO 客户端库与服务器建立连接,并监听连接成功、消息发送和接收等事件,实现了一个简单的聊天室应用。网页运行结果:

图片

文本框中输入消息显示在网页上:

图片

注:ChatGTP给出的SocketIO和Jquery库不是最新的链接,实际运行是会报错,要改成下面的最新的链接:

    <script src="https://cdn.socket.io/socket.io-3.0.5.js"></script>
    <script src="https://code.jquery.com/jquery-3.7.0.min.js"></script>


小结:

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注