flask websocket服务搭建,flask-sock 和 flask-socketio

flask websocket服务搭建,flask-sock 和 flask-socketio

首先说下socket、socketio 和 websockets 之间的区别

socket是网络上运行的两个程序之间的双向通信链路的一个端点。这是一个非常低级的东西,其他一切都是在 TCP 套接字之上实现的。 WebSocket 是 Web 的标准通信协议。它允许在客户端和服务器之间建立全双工通信通道。 Socket.IO 是一种基于 HTTP 和 WebSocket 构建的通信协议,提供自动重新连接、基于事件的通知等额外功能。 Flask-SocketIO 是 Socket.IO 服务器端协议的实现,作为 Flask 扩展。

两个主流框架flask-sock 和 flask-socketio

flask-sock是原生的websocket协议,flask-socketio是socketio协议,需要根据你自己的需求选择合适的框架,如果用socketio那么客户端建议也用socketio库进行连接

websocket收发的都是原生的数据包

而socketio在原生的数据包上还加了协议数据比如状态码和监听事件等

特性WebSocketSocket.IO
连接协议基于WebSocket协议封装的WebSocket协议,提供更多功能
数据包结构包含Opcode, Payload Length, Mask, Payload Data包含Event name和Data
功能定义标准的双向通信,没有内建的重连或事件支持支持事件、重连、自动重试、命名空间等功能
发送和接收方式通过raw WebSocket send和onmessage直接发送和接收封装的数据通过emit和on方法,使用事件名来识别
支持的传输方式只支持WebSocket支持多个传输方式(WebSocket, Polling等)

安装两个库

pip install flask-socketio flask-sock

flask-sock例子

服务端example

from flask import Flask, render_template
from flask_sock import Sockapp = Flask(__name__)
app.config['SOCK_SERVER_OPTIONS'] = {'ping_interval': 25}sock = Sock(app)@app.route('/')
def index():return render_template('index.html')@sock.route('/echo')
def echo(ws):while True:data = ws.receive()if data == 'close':breakws.send(data)if __name__ == '__main__':app.run()

客户端example

from flask import Flask, render_template
from flask_sock import Sockapp = Flask(__name__)
app.config['SOCK_SERVER_OPTIONS'] = {'ping_interval': 25}sock = Sock(app)@app.route('/')
def index():return render_template('index.html')@sock.route('/echo')
def echo(ws):while True:data = ws.receive()if data == 'close':breakws.send(data)if __name__ == '__main__':app.run()

flask-socketio例子

服务端example

from flask import Flask, render_template
from flask_socketio import SocketIO, emitapp = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key'  # 设置一个密钥用于会话、Cookie等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)  # Echo the received message back@socketio.on('close')
def handle_close():print('Closing connection')if __name__ == '__main__':socketio.run(app)

客户端example

import time
import socketio# 创建 SocketIO 客户端实例
sio = socketio.Client()@sio.event
def connect():print("Connection established")@sio.event
def message(data):print(f"Message received: {data}")@sio.event
def disconnect():print("Disconnected from server")# 连接到服务器
sio.connect('http://localhost:5000')# 发送消息
sio.send("Hello, Socket.IO!")# 等待一些时间以接收消息
time.sleep(1)# 发送关闭消息并断开连接
sio.disconnect()

如果要用websocket格式来测试这个socketio接口

import websockets
import asyncio
import json
import time
import randomasync def test_socketio():# Socket.IO 在 WebSocket URL 上添加特定的路径和参数uri = "ws://localhost:5000/socket.io/?EIO=4&transport=websocket"async with websockets.connect(uri) as ws:print("Connected to server")# 发送 Socket.IO 握手消息await ws.send("40")  # Socket.IO v4 握手消息# 发送消息message = {"type": "message","data": "Hello, Socket.IO!"}# Socket.IO 消息格式: "42" + JSON数组 [event, data]socketio_msg = f'42{json.dumps(["message", message])}'await ws.send(socketio_msg)# 接收消息try:while True:response = await asyncio.wait_for(ws.recv(), timeout=2)print(f"Received: {response}")# 如果是 PING 消息(2),回应 PONG(3)if response.startswith("2"):await ws.send("3")continue# 解析常规消息if response.startswith("42"):try:data = json.loads(response[2:])print(f"Parsed message: {data}")except json.JSONDecodeError:print("Failed to parse message")except asyncio.TimeoutError:print("No more messages")# 发送关闭消息await ws.send("41")  # Socket.IO 关闭消息if __name__ == "__main__":asyncio.run(test_socketio())

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

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

相关文章

基于 Java 语言双代号网络图自动绘制系统

基于Java语言双代号网络图自动绘制系统研究与实现 一、摘要 网络计划技术已被广泛应用于工业、农业、国防、科学研究等多个领域中的项目计划与管理,以缩短项目周期,提高资源的利用效率。在网络计划技术中,绘制网络图是网络计划技术的基础工…

多模态大模型微调实践!PAI+LLaMA Factory搭建AI导游

一、引言 AI的快速发展推动了各行各业的智能化转型和创新,随之而来的是对AI应用的迫切需求。 如何微调大模型、高效搭建AI应用成为了开发者们广泛关注的技术方向。阿里云人工智能平台PAI,联合开源低代码大模型微调框架LLaMA Factory ,共同打…

设计模式-单例模型(单件模式、Singleton)

单例模式是一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点。 单例模式同时解决了两个问题, 所以违反了单一职责原则: 保证一个类只有一个实例。 为什么会有人想要控制一个类所拥有的实例…

metasploit/modules/auxiliary 有哪些模块,以及具体使用案例

Metasploit框架的auxiliary模块涵盖了许多不同的功能,包括扫描、枚举、信息收集和漏洞探测等。以下是一些常见的auxiliary模块及其使用案例: 1. 端口扫描 auxiliary/scanner/portscan/tcp:TCP端口扫描。 use auxiliary/scanner/portscan/tcp…

基于SSM+微信小程序的社团登录管理系统(社团1)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 2、项目技术 3、开发环境 4、功能介绍 1、项目介绍 基于SSM微信小程序的社团登录管理系统实现了管理员及社团、用户。 1、管理员实现了首页、用户管理、社团管理、社团信息管理、社…

DAYWEB69 攻防-Java 安全JWT 攻防Swagger 自动化算法签名密匙Druid 泄漏

知识点 1、Java安全-Druid监控-未授权访问&信息泄漏 2、Java安全-Swagger接口-文档导入&联动批量测试 2、Java安全-JWT令牌攻防-空算法&未签名&密匙提取 Java安全-Druid监控-未授权访问&信息泄漏 Druid是阿里巴巴数据库事业部出品,为监控而…

SMO算法 公式推导

min ⁡ α 1 2 ∑ i 1 N ∑ j 1 N α i α j y i y j K ( x i ⋅ x j ) − ∑ i 1 N α i s.t. ∑ i 1 N α i y i 0 0 ≤ α i ≤ C , i 1 , 2 , ⋯ , N (9-69) \begin{aligned} & \min_{\alpha} \quad \frac{1}{2} \sum_{i1}^{N} \sum_{j1}^{N} \alpha_i \alpha_j…

OpenCV系列教程六:信用卡数字识别、人脸检测、车牌/答题卡识别、OCR

文章目录 一、信用卡数字识别1.1 模板匹配1.2 匹配多个对象1.3 处理数字模板1.4 预处理卡片信息,得到4组数字块。1.5 遍历数字块,将卡片中每个数字与模板数字进行匹配 二、人脸检测2.1人脸检测算法原理2.2 OpenCV中的人脸检测流程 三、车牌识别3.1 安装t…

Python常用库版本匹配

Python3.7 可运行bert、glove等 Package Version ------------------------------- --------------------- -ip 20.1.1 absl-py 1.4.0 affinegap 1.12 aio-pika …

2024年10月总结及随笔之漏更及失而复得

1. 回头看 日更坚持了670天。 读《数据湖仓》更新完成读《数据工程之道:设计和构建健壮的数据系统》开更并持续更新 2023年至2024年10月底累计码字1642797字,累计日均码字2451字。 2024年10月码字86801字,同比下降30.77%,环比…

VScode + PlatformIO 了解

​Visual Studio Code Visual Studio Code(简称 VS Code)是一款由微软开发且跨平台的免费源代码编辑器。该软件以扩展的方式支持语法高亮、代码自动补全(又称 IntelliSense)、代码重构功能,并且内置了工具和 Git 版本…

【linux】ubunda repo是什么

Ubuntu repo(repository,简称repo)是一个软件仓库,它是存储和分发软件包的服务器或一组服务器。通俗地说,Ubuntu repo就像一个巨大的在线软件商店,用户可以从中下载和安装各种软件。 主要特点 软件集合&a…

一二三应用开发平台自定义查询设计与实现系列2——查询方案功能实现

查询方案功能实现 上面实现了自定义查询功能框架,从用户角度出发,有些条件组合可以形成特定的查询方案,对应着业务查询场景。诸多查询条件的组合,不能每次都让用户来设置,而是应该保存下来,下次可以直接使…

WebSocket 连接频繁断开的问题及解决方案

文章目录 WebSocket 连接频繁断开的问题及解决方案1. 引言2. 什么是 WebSocket?2.1 WebSocket 的优势2.2 WebSocket 的工作原理 3. WebSocket 连接频繁断开的常见原因3.1 服务器端问题3.1.1 服务器负载过高3.1.2 服务器配置不当3.1.3 超时设置 3.2 网络问题3.2.1 网…

Java迭代器:深入理解与应用

在Java编程中,迭代器(Iterator)是一个用于遍历集合(Collection)的接口。它提供了一种标准的方式来访问集合中的元素,而不需要暴露其底层结构。本文将详细介绍Java迭代器的概念、工作原理、实现方式以及如何…

萤石私有化设备视频平台EasyCVR视频融合平台如何构建农业综合监控监管系统?

现代农业的迅速发展中,集成监控管理系统已成为提高农业生产效率和优化管理的关键工具。萤石私有化设备视频平台EasyCVR,作为一个具有高度可扩展性、灵活的视频处理能力和便捷的部署方式的视频监控解决方案,为农业监控系统的建设提供了坚实的技…

AI会助力元宇宙的发展吗?

AI将会在元宇宙的发展中扮演关键角色。AI在元宇宙中的应用将推动沉浸式、个性化和智能化体验的实现,具体表现在以下几个方面: 1、虚拟角色和智能交互:AI技术可用来创造智能化虚拟角色,如NPC(非玩家角色)&a…

#渗透测试#SRC漏洞挖掘# 信息收集-Shodan之搜索语法进阶

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…

Fsm3

采用读热码编写方式: module top_module(input clk,input in,input areset,output out); ////reg [3:0]A 4d0001;// reg [3:0]B 4d0010;//reg [3:0]C 4d0100;// reg [3:0]D 4d1000; //1、首先用读热码定义四个状态变量parameter A 4d0001 ,B 4d0010, C 4d01…

Highcharts 条形图:数据可视化的利器

Highcharts 条形图:数据可视化的利器 引言 在数据分析和可视化领域,Highcharts 是一个广受欢迎的 JavaScript 图表库。它以其易用性、灵活性和丰富的图表类型而著称。其中,条形图作为一种基础但功能强大的图表类型,被广泛应用于各种场景,以直观地展示数据分布和比较。本…