8.flask+websocket

devtools/2025/2/12 9:40:03/

http是短连接,无状态的。

websocket是长连接,有状态的。

flask中使用websocket

python">from flask import Flask, request
import asyncio
import json
import time
import websockets
from threading import Thread
from urllib.parse import urlparse, parse_qs
from functools import partialapp = Flask(__name__)# 存储所有的WS客户端对象
# websocketClient_list = []
userId_websocketClient = dict()async def send_message(message):# while True:#     if websocketClient_list:#         message = json.dumps({"time": str(time.time())}, ensure_ascii=False)#         await asyncio.wait([client.send(message) for client in websocketClient_list])#     await asyncio.sleep(1)# message = json.dumps({"time": str(time.time())}, ensure_ascii=False)# await asyncio.wait([client.send(message) for client in websocketClient_list])client = userId_websocketClient.get('1')if client:await asyncio.wait([client.send(message)])async def websocket_handler(websocket, path):parsed_url = urlparse(path)query_params = parse_qs(parsed_url.query)# 访问参数user_id = query_params.get('userId')user_id = user_id[0] if user_id[0] else Noneif user_id:userId_websocketClient[user_id] = websocket# websocketClient_list.append(websocket)try:async for message in websocket:print(f"客户端发来消息:{message}")except websockets.ConnectionClosed:print("websocket closed")finally:# websocketClient_list.remove(websocket)del userId_websocketClient[user_id]@app.route("/framework/pushMessage/framework_czc")
def index():return "WebSocket server is running. Connect to ws://<server-address>:8001/websocket"@app.route("/send/message")
def sendMessage():message = "xxxxxx"# 创建带有参数的协程对象coro = partial(send_message, message)asyncio.set_event_loop(asyncio.new_event_loop())loop = asyncio.get_event_loop()loop.run_until_complete(coro())loop.close()return "success"def run_websocket_server():asyncio.set_event_loop(asyncio.new_event_loop())start_server = websockets.serve(websocket_handler, "0.0.0.0", 8001)asyncio.get_event_loop().run_until_complete(start_server)# asyncio.get_event_loop().run_until_complete(send_message())asyncio.get_event_loop().run_forever()if __name__ == '__main__':websocket_thread = Thread(target=run_websocket_server)websocket_thread.start()app.run(host="0.0.0.0", port=8000)

http://www.ppmy.cn/devtools/158170.html

相关文章

玩转工厂模式

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 什么是工厂模式?工厂方法模式适合应用场景实现方式工厂方法模式优缺点什么是工厂模式? 工厂方法模式是一种创建型设计模式,其在父类中提供一个创建对象的方法,允许子类决定实例化对象的类型。…

Visual Studio 使用 “Ctrl + /”键设置注释和取消注释

问题&#xff1a;在默认的Visual Studio中&#xff0c;选择单行代码后&#xff0c;按下Ctrl /键会将代码注释掉&#xff0c;但再次按下Ctrl /键时&#xff0c;会进行双重注释&#xff0c;这不是我们想要的。 实现效果&#xff1a;当按下Ctrl /键会将代码注释掉&#xff0c;…

嵌入式系统开发中的图形后台(graphical backend)是什么意思?

图形后台的概述 “图形后台”是指在计算机系统中负责管理和渲染图形界面&#xff08;GUI&#xff09;的程序或系统。 在嵌入式设备上&#xff0c;图形系统的选择通常包括以下几种主要类型&#xff1a; X11&#xff08;X Window System&#xff09;&#xff1a; 这是一个传统的…

Goland 内存逃逸问题

内存逃逸是什么&#xff1f; 在go语言中&#xff0c;内存分配存在两个方式&#xff1a;堆分配&#xff1b;栈分配。 栈分配&#xff1a;是在函数调用时为局部变量分配内存&#xff0c;当函数返回时&#xff0c;这些内存会自动释放。 堆分配&#xff1a;通过 new 或者 make 函…

计算机毕业设计Spark+大模型知网文献论文推荐系统 知识图谱 知网爬虫 知网数据分析 知网大数据 知网可视化 预测系统 大数据毕业设计 机器学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

Springboot 中使用如何Sentinel

在 Spring Boot 中使用 Sentinel 非常方便&#xff0c;Spring Cloud Alibaba 提供了 spring-cloud-starter-alibaba-sentinel 组件&#xff0c;可以快速将 Sentinel 集成到你的 Spring Boot 应用中&#xff0c;并利用其强大的流量控制和容错能力。 下面是一个详细的步骤指南 …

webpack配置之---output.chunkLoadTimeout

output.chunkLoadTimeout output.chunkLoadTimeout 是 Webpack 配置中的一个选项&#xff0c;用于设置在加载异步 chunk&#xff08;代码块&#xff09;时&#xff0c;超时等待的时间&#xff08;以毫秒为单位&#xff09;。如果在指定的时间内无法加载 chunk&#xff0c;Webp…

Java网络编程学习(一)

网络相关概念 网络体系结构 OSI体系结构&#xff08;七层&#xff09; OSI&#xff08;Open Systems Interconnection&#xff0c;开放系统互联&#xff09;体系结构将整个计算机网络分为七层&#xff0c;从上到下依次为&#xff1a;应用层、表示层、会话层、传输层、网络层…