使用FastAPI同时搭建WebSocket服务端和HTTP服务端

使用FastAPI搭建WebSocket服务端和HTTP服务端

1. WebSocket协议

WebSocket协议是一种在单个TCP连接上进行全双工通信的网络协议。它提供了双向通信的能力,允许服务器和客户端之间进行实时数据传输。与HTTP不同,WebSocket在连接建立后保持打开状态,可以在任何时间点双向传输数据,而不需要每次请求都建立新的连接。在 WebSocket 协议握手阶段,客户端和服务器之间会通过 HTTP 协议进行握手升级,从而建立 WebSocket 连接。

WebSocket协议的关键特点包括:

  • 全双工通信: 服务器和客户端可以同时向对方发送和接收数据。
  • 持久连接: 连接在建立后保持打开状态,允许实时通信而无需重复建立连接。
  • 轻量级消息格式: WebSocket消息的开销相对较小,因为它们不需要HTTP的头部信息。
  • 低延迟: 由于保持了持久连接,可以实现实时性要求较高的应用,如聊天应用和实时游戏。

2. FastAPI

FastAPI 是一个现代、快速(高性能)的 web 框架,用于构建基于 Python 的 API。它是建立在 Starlette 和 Pydantic 之上的,这两者都是非常流行的 Python 库。FastAPI 旨在提供简单易用的 API 开发体验,同时保持高性能和强大的功能。以下是 FastAPI 的一些特点和优势:

  • 快速高效:FastAPI 极其快速,并且具有异步请求处理的能力,这使得它成为处理高并发请求的理想选择。
  • 基于标准:FastAPI 基于标准的 Python 类型提示和标准的 Python 异步框架,这使得它易于学习和使用,并且能够充分利用 Python 的强大功能。
  • 自动文档生成:FastAPI 可以自动生成交互式 API 文档,支持 Swagger UI 和 ReDoc,这样可以方便地查看和测试 API。
  • 数据验证和序列化:FastAPI 集成了 Pydantic,可以方便地进行数据验证和序列化,提供了强大的数据校验功能。
  • 依赖注入系统:FastAPI 内置了依赖注入系统,可以轻松管理 API 中的依赖关系。
  • 简单易用:FastAPI 设计简洁、直观,提供了易于理解的 API 开发体验,使得开发者能够快速构建出高效、稳健的 API。

总的来说,FastAPI 是一个功能强大、性能优越的 Python web 框架,适用于构建各种类型的 API 服务。它的简单易用性、高性能和标准化特性使得它成为了众多开发者的首选框架之一。

3. 使用FastAPI搭建WebSocket服务端

使用FastAPI + uvicorn可以快速搭建HTTP服务端,而WebSocket是基于HTTP协议的协议,所以FastAPI支持同时搭建HTTP和WebSocket服务。也就是说,你可以在一个FastAPI的应用中,同时提供HTTP和WebSocket服务,以下是代码示例。

import uvicorn
from fastapi import FastAPI, WebSocket
from loguru import loggerclass WebsocketServer:def __init__(self):self.wbs_client = Noneself.wbs_server: FastAPI = FastAPI()self.wbs_server.add_api_websocket_route(path='/test_websocket_path', endpoint=self.test_wbs_path_connection)self.wbs_server.add_api_route(path='/test_http_path', endpoint=self.test_http_path_connection, methods=['GET'])async def test_wbs_path_connection(self, websocket: WebSocket):self.wbs_client = websocketawait websocket.accept()while True:data = await websocket.receive_text()logger.info(f'收到消息:{data}')await self.wbs_client.send_text(data)logger.info(f'发送消息:{data}')async def test_http_path_connection(self):return 'test http'def start_serving(self):uvicorn.run(self.wbs_server, host='0.0.0.0', port=8001, loop='asyncio')def main():websocket_server = WebsocketServer()websocket_server.start_serving()if __name__ == '__main__':main()

其中,代码self.wbs_server.add_api_websocket_route(path='/test_websocket_path', endpoint=self.test_wbs_path_connection)添加了一个WebSocket路径,在客户端,使用地址ws://127.0.0.1:8001/test_websocket_path即可连接。

代码self.wbs_server.add_api_route(path='/test_http_path', endpoint=self.test_http_path_connection, methods=['GET'])添加了一个HTTP GET服务路径,在客户端,使用地址http://127.0.0.1:8001/test_http_path即可进行访问。

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

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

相关文章

网络工程师---第四十三天

1、网络地址转换请简述DNS服务器迭代查询与递归的区别? 2、请从技术方面简述RAIDO、RAID1、RAID3、 RAID5的特点? 3、请从层次结构、部署设备和功能配置方面描述层次化的网络结构? 4、请简述IPSECVPN和AH和ESP的区别? 5、请简述ID…

[Android]Mac电脑ADB使用

在Android开发中,ADB(Android Debug Bridge)是一个非常重要的工具,它提供了开发者与Android设备之间进行通信的多种方式。安装ADB对于任何进行Android开发的人来说都是必不可少的,尤其是在Mac电脑上进行开发时。 1. 安…

Java网络编程之TCP协议核心机制(三)

题外话 最近学习内容很多嗷 正题 延时应答机制 当客户端发送数据到服务器时,服务器不会立即返回ACK,而是等待一会再返回ACK 这段等待时间应用程序可能会消化掉接收缓冲区中的数据,当服务器返回ACK时,就会携带此时接收缓冲区大小的信息 当客户端下次再发送数据的时候就可以…

SQL 语言:数据操作

文章目录 SELECT 基本结构简单查询连接查询子查询聚集函数和更名操作分组查询字符串操作集合操作UNION 运算INTERSECT 运算EXCEPT 运算 视图查询和更新WITH 子句其他语句总结 SQL 的数据操作包括 SELECT(查询)、INSERT(插入)、DELETE(删除)和 UPDATE(修改)四条语句。 SELECT 基…

深度学习——自适应图片大小选择线宽和字体大小

不知道大家在可视化检测结果时是否会有设置的线宽太小在图片上画出来的框看不清楚,写的字符串看不清楚的烦恼。我发现不论是什么大小的图片,使用yolov5可视化线宽和字符串都能很清晰的显示出来,我根据yolov5上面的可视化代码,改写…

钡铼PLC集成BL121PO协议网关优化电子制造产线的生产效率

PLC转OPC UA协议转换网关BL121PO在电子制造产线中的优化应用,可以显著提高生产效率,促进生产线的智能化和信息化发展。本文将从以下几个方面进行阐述: 提高设备间通信效率:PLC转OPC UA协议转换网关BL121PO通过高效的协议转换&…

Flutter 中的 PositionedTransition 小部件:全面指南

Flutter 中的 PositionedTransition 小部件:全面指南 在 Flutter 中,PositionedTransition 是一个动画 widget,它允许你创建一个动画,使得一个子 widget 从屏幕的一个位置平滑过渡到另一个位置。这在实现各种动态布局变化时非常有…

SpringBoot基础篇

1:parent 目的:减少依赖配置 开发SpringBoot程序要继承spring-boot-starter-parentspring-boot-starter-parent中定义了若干个依赖管理继承parent模块可以避免多个依赖使用相同技术出现依赖版本冲突继承parent的形式也可以采用引入依赖的i形式实现效果…

就说说开一家公司的流程和成本

本人在进互联网公司和外企前,也和一位老板合作做,在一家小微公司里做过技术负责人,所以也了解开办一家公司的流程以及公司运作的成本。 通过本文大家其实能看到创业的难度。具体来讲,开办并维持着一家公司,其实需要操…

使用python写一个程序,持续监控某个windows进程的活动信息,例如占用cpu比例、占用内存等

使用python写一个程序,持续监控某个windows进程的活动信息,例如占用cpu比例、占用内存等 要持续监控某个Windows进程的活动信息,如CPU和内存占用,你可以使用psutil库。如果你还没有安装这个库,你可以使用pip进行安装&…

Python开发 —— 变量、全局变量函数的参数传递

1. Python变量 1.1 变量的定义和使用 在Python中,变量不需要显式声明。通过赋值语句,变量会自动创建。例如: x 10 y "Hello, World!"在这段代码中,x 被赋值为整数10,而 y 被赋值为字符串 "Hello, W…

SpringCloudOpenFeign的详解

1. SpringCloud OpenFeign的特性 1. 概念 Feign是一个声明式web Rest服务客户端。它使编写web服务客户端更容易要使用Feign,请创建一个接口并对其使用注解进行标注它具有可插入注释支持,包括Feign注释和JAX-RS注释Feign还支持可插拔编码器和解码器Spri…

Day25

Day25 网络编程概念 计算机网络 网络编程:TCP协议的三次握手四次挥手 IP地址,端口号:取值范围:065535,保留端口号:01024。 网络协议:TCP协议(类比于打电话,双方需要连接…

项目构建工具maven

一、概述 1、maven是apache的一个开源项目,是一个优秀的项目构建/管理工具 2、apache(软件基金会、非盈利组织、管理维护一些开源项目) 二、功能 1、管理项目中jar包和jar包与jar包之间的依赖 2、完成项目编译、测试、打包 三、核心文件 pom.xml:在里面配置相…

信息学奥赛初赛天天练-14-阅读程序-字符数组、唯一分解定理应用

更多资源请关注纽扣编程微信公众号 1 2019 CSP-J 阅读程序1 (程序输入不超过数组或字符串定义的范围;判断题正确填√,错误填;除特殊说明外,判断题1.5分,选择题3分,共计40分) 1 输入的字符串只能由小写字母或大写字母组…

Redis的非关系型数据库

第七天课堂笔记 今日目标 非关系型数据库(nosql【not only SQL】数据库) Redis的非关系型数据库 Redis的安装和配置 Redis常见数据类型 Redis特性 nosql数据库 not only sql数据库,非关系型数据库,往往采用类似于json来存储数…

【大宗】第一期:大航海时代下的[集运欧线]

一、大航海时代 - 集运欧线前世今生 01 航运合约指数的诞生 ‍‍‍‍ 2023年8月18日,上海期货交易所的伙伴们搞了个大新闻——他们推出了一种新的期货品种,叫做“欧线集运”。这可不是什么普通的期货,它是基于一个叫做SCFIS的指数&#xf…

上海汇正财经官网怎么样?客户好评如潮,口碑赞誉之声不绝于耳

在财经服务领域,客户评价是衡量一家企业信誉和服务质量的重要标准。上海汇正财经作为业内知名的财经服务平台,以其优质的服务赢得了广大客户的认可和好评。大量正面用户评价和成功服务的案例,充分证明了上海汇正财经是一个值得信赖的正规企业…

每日两题 / 131. 分割回文串 42. 接雨水(LeetCode热题100)

131. 分割回文串 - 力扣&#xff08;LeetCode&#xff09; 数据量较小&#xff0c;考虑直接暴力&#xff0c;每次dfs&#xff1a;以bg作为左区间&#xff0c;往右遍历&#xff0c;找到一段回文串区间后&#xff0c;将回文串插入vector<string>&#xff0c;并以下一个下标…

段位在于面对人性之恶,一笑而过

这个小哥哥不知道是哪里不对劲了&#xff0c;突然给我留言说我在骗流量&#xff0c;骗关注。公众号是我的&#xff0c;文章是我写的&#xff0c;主要分享的就是我创业的一些接单案例&#xff0c;因为之前收到很多无效的留言&#xff0c;寻求合作就几个字我不想接收无效信息&…