Flask-SocketIO

news2024/12/25 13:24:33

一、简介:

Flask-SocketIO使Flask应用程序可以实现客户端和服务器之间的低延迟双向通信。客户端应用程序可以使用 Javascript、Python、C++、Java和Swift中的任何SocketIO客户端库或任何其他兼容客户端来建立与服务器的永久连接。

二、安装:

pip install flask-socketio

三、运行Flask-SocketIO要求:

Flask-SocketIO必须要Python 3.6+的版本,可以从下面三个选项中选择:

  1. eventlet是性能最好的选择,支持长轮询和WebSocket传输。
  2. 也可以使用gevent。gevent包完全支持长轮询传输,但与eventlet不同的是,gevent没有原生 WebSocket 支持。要添加对 WebSocket 的支持,目前有两个选项。安装gevent-websocket 包为 gevent 添加了 WebSocket 支持,或者可以使用带有 WebSocket 功能的uWSGI Web 服务器。使用 gevent 也是一个性能比较高的选择,但比 eventlet 略低。
  3. 也可以使用基于 Werkzeug 的 Flask 开发服务器,但需要注意的是,该 Web 服务器仅用于开发用途,因此它应该仅用于简化开发工作流程,而不用于生产。

Flask-SocketIO会根据安装的包自动检测要使用的异步框架。优先使用 eventlet,其次是 gevent。对于 gevent 中的 WebSocket 支持,首选 uWSGI,其次是 gevent-websocket。如果 eventlet 和 gevent 均未安装,则使用 Flask 开发服务器。

如果使用多个进程,则必须配置消息队列服务以允许服务器协调广播等操作。支持的队列是Redis、RabbitMQ、 Kafka以及Kombu包支持的任何其他消息队列。

在客户端,可以使用官方的 Socket.IO Javascript 客户端库来建立与服务器的连接。还有用 Swift、Java 和 C++ 编写的官方客户端。非官方客户端也可以工作,只要它们实现了 Socket.IO 协议就可以。Python-SocketIO 包实现了SocketIO协议的Python客户端。(注:Python-SocketIO也是Flask-SocketIO作者写的)。

四、初始化

以下代码示例展示了如何将 Flask-SocketIO 添加到 Flask 应用程序:

from flask import Flask, render_template
from flask_socketio import SocketIO

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

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

当然,也支持init_app()这种方式的初始化风格。请注意 Web 服务器的启动方式,现在变为socketio.run(),而不是app.run()。
当应用程序处于调试模式时,socketio.run()仍然使用的是Werkzeug 开发服务器。在生产模式下,如果可用,则使用 eventlet 网络服务器,否则使用 gevent 网络服务器。如果未安装 eventlet 和 gevent,则使用 Werkzeug 开发 Web 服务器。

Flask 0.11 中引入的命令可以用于启动基于 Werkzeug 的 Flask-SocketIO 开发服务器,但由于缺乏 WebSocket 支持,不推荐这种启动 方法。此软件包的先前版本包括该命令的自定义版本,该版本 允许在 eventlet 和 gevent 生产服务器上使用 WebSocket,但此功能已停止使用,取而代之的是上面显示的更健壮的socketio.run(app)启动方法。。

应用程序必须向加载 Socket.IO 库并建立连接的客户端提供一个页面:

<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js" integrity="sha512-q/dWJ3kcmjBLU4Qc47E4A9kTB4m3wuTY7vkFJDTZKjTs8jhyGQnaUrxa0Ytd0ssMZhbNua9hE+E7Qv1j+DyZwA==" crossorigin="anonymous"></script>
<script type="text/javascript" charset="utf-8">
    var socket = io();
    socket.on('connect', function() {
        socket.emit('my event', {data: 'I\'m connected!'});
    });
</script>

测试案例

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

app = Flask(__name__)
socketio = SocketIO(app)


@app.route('/')
def hello_world():  # put application's code here
    return render_template("index.html")


@socketio.on('connect')
def connect():
    print('ip:' + request.remote_addr)
    print('sid:' + request.sid)

@socketio.on('zhiliao')
def zhiliao_event(data):
    print(data)
    return {"result":"success"}

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

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>SocketIO测试</title>
</head>
<body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js"
        integrity="sha512-q/dWJ3kcmjBLU4Qc47E4A9kTB4m3wuTY7vkFJDTZKjTs8jhyGQnaUrxa0Ytd0ssMZhbNua9hE+E7Qv1j+DyZwA=="
        crossorigin="anonymous"></script>

<script type="text/javascript" charset="utf-8">
    var socket = io();
    socket.on('connect', function () {
        socket.emit('my event', {data: 'I\'m connected!'});
    });
    socket.emit("zhiliao",{"message":"i am dd"},function (result){
        console.log("时间发送成功");
        console.log(result);
    })

</script>

</body>
</html>

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/820837.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java高并发系列 - 第22天:JUC底层工具类Unsafe

java高并发系列 - 第22天:JUC底层工具类Unsafe 这是java高并发系列第22篇文章,文章基于jdk1.8环境。 本文主要内容 Unsafe基本介绍获取Unsafe实例Unsafe中的CAS操作Unsafe中原子操作相关方法介绍Unsafe中线程调度相关方法介绍park和unpark示例Unsafe锁示例Unsafe中对volati…

window安装mysql

1、下载mysql 官网下载地址&#xff1a;MySQL :: Download MySQL Community Server 国内阿里云镜像下载地址&#xff1a;mysql镜像_mysql下载地址_mysql安装教程-阿里巴巴开源镜像站 2、安装 我下载的是mysql-5.7.36-winx64.msi安装版本 选择安装类型&#xff1a; 选择安装位…

【测试设计】性能测试工具选择:wrk?jmeter?locust?还是LR?

目录 前言 wrk 优点 缺点 jmeter 优点 缺点 locust 优点 缺点 总结 资料获取方法 前言 当你想做性能测试的时候&#xff0c;你会选择什么样的测试工具呢&#xff1f;是会选择wrk&#xff1f;jmeter&#xff1f;locust&#xff1f;还是loadrunner呢&#xff1f; 今…

台式机/工控机通过网线共享笔记本电脑无线网络(待续)

1、 将台式机通过网线和笔记本连接。 2、 将笔记本的“本地连接”和“无线网络连接”的ipv4均设置为自动获取。 4.修改台式机的IP地址为如下&#xff08;对应笔记本信息&#xff09; IP地址为192.168.XXX.12 子网掩码为255.255.255.0 默认网关为192.168.XXX.1 首选DNS为192.16…

蓝桥云课ROS机器人旧版实验报告-06工业机械臂-使用Moveit!

项目名称 实验六 使用MoveIt&#xff01; 成绩 内容&#xff1a;机械臂、体系结构、简单运动规划、抓取放置任务 实验记录&#xff08;70分&#xff09; 按实验一完成升级配置。 如果需要查阅moveit详细资料&#xff0c;参考如下官网截图&#xff1a; 本实验需要安装…

python面试题【题目+答案】

最近遇到了一份python的面试题&#xff0c;题目比较简单&#xff0c;时间控制在一个小时之内。以下是面试的题目跟答案&#xff0c;答案不代表最优解&#xff0c;只是当时所想到的一些思路&#xff0c;接下来将分享给大家。 1. 给出下面打印结果 答案&#xff1a; 12.0 6.0…

二叉树OJ(C)

文章目录 1.单值二叉树1.1法一&#xff1a;无返回值1.2法二&#xff1a;有返回值 2.相同的树3.对称二叉树4.二叉树的前序遍历5.二叉树的中序遍历6.二叉树的后序遍历7.另一棵树的子树8.二叉树遍历 1.单值二叉树 1.1法一&#xff1a;无返回值 struct TreeNode {int val;struct …

从国内最早的开放银行说起...

在银行技术部门工作的这几年&#xff0c;频繁听到「开放银行」这个概念。 "开放银行"一词是指通过应用编程接口&#xff08;API&#xff09;在各方之间共享财务数据的业务模式&#xff0c;包括金融服务提供商&#xff08;银行、保险公司、零售商等&#xff09;之间、…

Excel·VBA定量装箱、凑数值金额、组合求和问题

如图&#xff1a;对图中A-C列数据&#xff0c;根据C列数量按照一定的取值范围&#xff0c;组成一个分组装箱&#xff0c;要求如下&#xff1a; 1&#xff0c;每箱数量最好凑足50&#xff0c;否则为47-56之间&#xff1b; 2&#xff0c;图中每行数据不得拆分&#xff1b; 3&…

数据结构--动态顺序表

文章目录 线性表动态顺序表数组与顺序表 接口实现初始化&#xff1a;尾插&#xff1a;尾删头插头删指定位置插入指定位置删除查找摧毁 完整代码 线性表 线性表是数据结构中最基本、最简单也是最常用的一种数据结构。线性表是指由n个具有相同数据类型的元素组成的有限序列。 线…

Kubernetes (k8s)理论介绍

一&#xff1a;K8s 简介 1、K8s作用 2、K8s 来历 3、为什么要用 K8S? 4、Kubernetes 功能 二&#xff1a;Kubernetes 集群架构与组件 1、Kubernetes 集群架构与组件 2、核心组件 -Master 组件 &#xff08;1&#xff09;Kube-apiserver &#xff08;2&#xff09;Kube…

Wiki知识库项目-全流程笔记

第一章 第二章 2.1本章项目流程 2.2创建springboot项目 2.2.1修改springboot的版本号为 2.4.0 2.2.3将代码交给git进行管理 2-5修改日志样式 2.5.1将springboot项目打印日志样式进行修改。创建logback-spring.xml文件夹&#xff0c;文件与application.xml文件位置并列。 &l…

图书借阅系统 SSM框架

步骤一&#xff1a;创建数据库、表 步骤二&#xff1a;创建工程、包、pom依赖 步骤三&#xff1a;web.xml 步骤四&#xff1a;applicationContext.xml 步骤五&#xff1a;mybatis-config.xml 步骤六&#xff1a;实体类 步骤七&#xff1a;BookInfoMapper 步骤八&#xff1a; 步…

小白到运维工程师自学之路 第六十一集 (docker容器的操作)

1、创建容器与运行容器 docker create -it nginx /bin/bash -i 让容器的输入保持打开 -t 让Docker 分配一个伪终端 -d 守护进程形式运行 使用docker create 命令创建新容器后会返回一个唯一的ID 2、查看运行状态 docker ps -a 可以使用docker ps 命令来查看所有容器的运行状态…

未能加载文件或程序集“System.CodeDom, Version=4.0.2.0。。。或它的某一个依赖项。系统找不到指定的文件

winform未能加载文件或程序集“System.CodeDom, Version4.0.2.0, Cultureneutral, PublicKeyTokencc7b13ffcd2ddd51”或它的某一个依赖项。系统找不到指定的文件。 触发原因解决方法 触发原因 在NuGet中安装IronPython时&#xff0c;由于一直提示缺少依赖&#xff0c;所以在安…

长度最小的子数组_力扣209

文章目录 题目描述法一 滑动窗口法 题目描述 法一 滑动窗口法 int minSubArrayLen(int target, vector<int>&nums){int n nums.size();int cnt INT_MAX;int start0, end0, sum0;while(end<n){sum nums[end];while(sum>target){cnt min(cnt, end-start1);su…

智慧灯杆四大应用场景

智慧灯杆是一种通过集成先进技术和智能系统的道路照明设施。它不仅具备传统灯杆的基本功能&#xff0c;还具有灯具、传感器、通信设备、监控摄像头等多个功能模块。可以实现智能照明、环境监测、安全监控、交通管理等多种功能&#xff0c;为城市的智慧化建设和市民的生活提供更…

html:去除input/textarea标签的拼写检查

默认情况下&#xff0c;textarea 会启动拼写和语法检查&#xff0c;表现效果就是单词拼写错误会出现红色下划线提示 <textarea></textarea>效果 有时&#xff0c;我们并不需要拼写检查&#xff0c;可以通过配置属性spellcheck"false" 去除拼写和语法检…

【打表】ccpc 2022威海 G

Problem - G - Codeforces 题意&#xff1a; 思路&#xff1a; 这种题大概率只能打表 把gcd(kx^x,x)的值打出来&#xff0c;可以发现是个循环节 Code&#xff1a; #include <bits/stdc.h>#define int long longusing namespace std;const int mxn1e610; const int mx…

PHP使用PhpSpreadsheet实现导出Excel时带下拉框列表 (可支持三级联动)

因项目需要导出Excel表 需要支持下拉 且 还需要支持三级联动功能 目前应为PHPExcel 不在维护&#xff0c;固采用 PhpSpreadsheet 效果如图&#xff1a; 第一步&#xff1a;首先 使用composer 获取PhpSpreadsheet 我这里PHP 版本 7.4 命令如下&#xff1a; composer r…