flask与vue实现通过websocket通信

目录

一、WebScoket介绍

WebSocket 是一种网络通信协议,它在单个 TCP 连接上提供全双工通信。与 HTTP 这种请求-响应模式的协议相比,WebSocket 的主要作用和优势包括:
主要作用

  1. 实时双向通信

    服务器可以主动向客户端推送消息

    客户端也可以随时向服务器发送消息

    典型的例子:聊天应用、实时通知、股票行情

  2. 低延迟通信

    建立连接后,数据传输几乎无延迟

    避免了 HTTP 的频繁连接建立和断开

    每个消息只有很小的帧头开销(2-14字节)

3.、 持久连接

一握手,长期保持连接

不像 HTTP 每次请求都要重新建立连接

二、Flask的相关配置

1、下载相关依赖库

如果还没有配置flask的话,需要先安装flask,同时为解决跨域问题,需要安装cors,解决前后端交互,使用socket。

java 复制代码
pip install flask
java 复制代码
pip install Flask Flask-SocketIO Flask-CORS

按照如下创建flask项目:

2、后端代码

(1)引入依赖

java 复制代码
from flask import Flask
from flask_socketio import SocketIO, emit
from flask_cors import CORS

(2)、创建flask实例

java 复制代码
app = Flask(__name__)

(3)、解决跨域

java 复制代码
CORS(app, resources={r"/*": {"origins": "*"}})

(4)、引入socket交互

java 复制代码
socketio = SocketIO(app, cors_allowed_origins="*")

(6)、后端代码webscoket

python 复制代码
# WebSocket事件处理
@socketio.on('connect')
def handle_connect():
    logger.info(f"客户端连接: {request.sid}")
    print("测试链接---------------------------------------")
    emit('connected', {'message': '连接成功'})
python 复制代码
@socketio.on('disconnect')
def handle_disconnect():
    logger.info(f"客户端断开连接: {request.sid}")
python 复制代码
@socketio.on('send_message')
def handle_message(message):  # 其中的message是前端传过来的
    print('Received message: ' + message)  # 打印前端传来的信息
    response = 'Server received: ' + message  # 字符串拼接
    emit('message', response)  # 接收到之后,返回response字符串给前端,作为回应

(7)、启动项目

html 复制代码
if __name__ == '__main__':

    socketio.run(
        app,
        host='0.0.0.0',
        port=5000,
        debug=True,
        use_reloader=False,
        log_output=True
    )

三、前端代码

1. 引入模块

html 复制代码
npm install socket.io-client

2.页面代码

html 复制代码
<template>
  <div>
    <div style="top: 300px;position: absolute;left: 350px;">
      <input  type="text" v-model="message" placeholder="Enter your message">
      <button @click="sendMessage">Send Message</button>
    </div>
    <div v-if="receivedMessage">
      <p>Received: {{ receivedMessage }}</p>
    </div>
  </div>
</template>

3.前端Vue代码

html 复制代码
    initWebSocket() {
      this.socket = io('http://localhost:5000', {
        transports: ['polling'],
        reconnection: true,
        reconnectionAttempts: 10,
        reconnectionDelay: 1000,
        forceNew: true,
        polling: {
          extraHeaders: {
            'X-Requested-With': 'XMLHttpRequest'
          }
        }
      })
      
      this.socket.on('connect', () => {
        console.log('WebSocket连接成功')
        this.wsConnected = true
        this.$message.success('实时连接已建立')
      })
      
      this.socket.on('disconnect', () => {
        console.log('WebSocket断开连接')
        this.wsConnected = false
        this.$message.warning('实时连接已断开')
      })
      
      this.socket.on('connected', (data) => {
        console.log('服务器连接确认:', data)
      })
    }
html 复制代码
methods: {
    sendMessage() {
      if (this.message) {
        this.socket.emit('send_message', this.message);
        this.message = '';  // 清空输入框
      }
    }
  }

四、演示

1、前端发送消息

2、查看后端接受的信息

3、查看浏览器中的信息

五、WebScoket优势

1.优势

实时双向通信:

1、WebSocket:允许服务器和客户端之间进行实时的双向通信。这意味着一旦连接建立,服务器可以主动向客户端推送数据,而不需要客户端请求 。这对于需要实时更新的应用(如聊天应用、实时游戏、股票行情、在线协作工具等)特别有用。

2、前后端接口(RESTAPI):主要采用HTTP协议的请求-响应模型,客户端需要定期发送请求来获取最新的数据(轮询) ,这会增加网络开销和延迟。
减少网络开销:

1、WebSocket:在建立连接后,数据交换是通过单一的TCP连接进行的,没有HTTP请求头的额外开销,这使得通信更为高效。

2、前后端接口(REST API):每次请求都包含完整的HTTP请求头信息,会增加额外的网络开销 ,尤其是在频繁请求的情况下。
延迟更低:

1、WebSocket:由于是持久连接,数据传输的延迟较低,适合对延迟敏感的应用。 前后端接口(RESTAPI):每次数据传输都需要建立新的连接,导致较高的延迟,且轮询方式会增加延迟。 服务器推送能力:

2、WebSocket:服务器可以随时向客户端推送数据,而无需客户端主动请求,适用于需要服务器主动通知客户端的场景。 前后端接口(RESTAPI):一般是客户端发起请求,服务器响应。虽然可以通过长轮询实现类似的效果,但效率较低且实现复杂。 连接状态管理:

3、WebSocket:连接状态由客户端和服务器共同管理,连接状态明确,一旦断开需要重连。 前后端接口(RESTAPI):每次请求都是独立的,无需维护连接状态,适合一些无状态的服务。

2.总结

WebSocketREST API 各有优缺点,具体使用哪种方式取决于应用的需求。对于需要实时、低延迟和双向通信的应用,WebSocket 是更好的选择。而对于传统的、无状态的数据交互,REST API 则更为合适。

相关推荐
Tzarevich2 小时前
从命令式到声明式:用 Vue 3 构建任务清单的开发哲学
javascript·vue.js·响应式编程
页面魔术3 小时前
⭐看完vite纪录片才知道尤大有多屌(上)
前端·javascript·vue.js
AI_56783 小时前
Vue3组件通信的实战指南
前端·javascript·vue.js
烤麻辣烫3 小时前
黑马大事件学习-16 (前端主页面)
前端·css·vue.js·学习
曲幽3 小时前
Flask路由入门指南:从基础定义到优先级与动态路由转换器
python·flask·web·route·path
2501_921649494 小时前
外汇与贵金属行情 API 集成指南:WebSocket 与 REST 调用实践
网络·后端·python·websocket·网络协议·金融
程序媛徐师姐4 小时前
Python基于Flask的mooc课程情感分类系统【附源码、文档说明】
python·flask·python慕课课程情感分类·mooc课程情感分类系统·慕课课程情感分类系统·python课程情感分类系统·python课程情感分类
滿4 小时前
Vue3 ElementPlus el-select 焦点事件数据不回显问题
javascript·vue.js·elementui
代码or搬砖4 小时前
Vue生命周期总结(四个阶段,八个钩子函数)
前端·javascript·vue.js