Flask 中使用 WebSocket 通信

2023-05-16

WebSocket 是一种计算机通信协议,通过单个 TCP 连接提供全双工通信信道。WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API 中,客户端和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

在 Flask 中使用 flask-sockets 实现 WebSocket 通信。

Flask-Sockets 官方地址 https://github.com/heroku-python/flask-sockets

1 入门示例

Flask 通过 flask-sockets 实现一个回声服务器作为示例(客户端发送什么数据,服务端就原样返回什么数据,就像回声一样)。

服务端示例:

pip3 install flask
pip3 install flask-sockets

flask_socket_demo.py 为服务端代码:

from flask import Flask
from flask_sockets import Sockets


app = Flask(__name__)
sockets = Sockets(app)


@sockets.route('/echo')
def echo_socket(ws):
    while not ws.closed:
        message = ws.receive()
        ws.send(message)


@app.route('/')
def hello():
    return 'Hello World!'


if __name__ == "__main__":
    from gevent import pywsgi
    from geventwebsocket.handler import WebSocketHandler
    server = pywsgi.WSGIServer(('127.0.0.1', 5000), app, handler_class=WebSocketHandler)
    server.serve_forever()

python3 实现 websocket 客户端示例:

pip3 install websocket-client

websocket_client_demo.py 为客户端代码:

from websocket import create_connection


def main():
    url = 'ws://127.0.0.1:5000/echo'
    ws = create_connection(url)
    print("获取连接状态:", ws.connected)

    ws.send("Hello")
    response = ws.recv()
    print("获取服务器返回的结果: ", response)
    ws.close()


if __name__ == '__main__':
    main()

2 使用 Flask blueprints 示例

from flask import Flask, Blueprint
from flask_sockets import Sockets


html = Blueprint(r'html', __name__)
ws = Blueprint(r'ws', __name__)


@html.route('/')
def hello():
    return 'Hello World!'


@ws.route('/echo')
def echo_socket(socket):
    while not socket.closed:
        message = socket.receive()
        socket.send(message)


app = Flask(__name__)
sockets = Sockets(app)

app.register_blueprint(html, url_prefix=r'/')
sockets.register_blueprint(ws, url_prefix=r'/')


if __name__ == "__main__":
    from gevent import pywsgi
    from geventwebsocket.handler import WebSocketHandler
    server = pywsgi.WSGIServer(('127.0.0.1', 5000), app, handler_class=WebSocketHandler)
    server.serve_forever()

3 补充

The websocket interface that is passed into your routes is provided by gevent-websocket. The basic methods are fairly straightforward — send, receive, send_frame, and close.

flask-sockets 是基于 gevent-websocket 实现的,使用的协程。如果接口中使用 time.sleep() 会阻塞进程,得用 gevent.sleep() 来进行切换使其他协程运行。

举个例子,有一个 http 轮询接口,浏览器每秒向服务端发送一次请求获取数据,那改造为 websocket 后,客户端与服务端建立连接后,客户端不再重复请求服务端了,服务端使用 gevent.sleep(1) 每隔一秒主动向客户端发送一次数据。

@sockets.route('/hello')
def echo_socket(ws):
    message = socket.receive()	# 接收客户端的数据
    while not ws.closed:
        ws.send('hello')		# 向客户端发送数据
        gevent.sleep(1)			# 不能使用 time.sleep(1), 否则会阻塞协程的运行
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flask 中使用 WebSocket 通信 的相关文章

随机推荐

  • Windows核心编程之 2 字符和字符串

    1 包含新的安全是字符串处理头文件 StrSafe h counof 宏可以计算缓冲区的元素个数 StringCchCat StringCchCopy StringCchPrintf 34 Cch 34 表示 字符数 StringCbCat
  • Windows核心编程之 用户模式下的线程同步 读写锁和条件变量

    读写锁 include lt Windows h gt include lt tchar h gt include lt stdio h gt include lt process h gt include lt winbase h gt
  • 八戒常用之php时间戳strtotime前一天或后一天的日期

    date default timezone set 39 PRC 39 默认时区 今天 date 34 Y m d 34 time 昨天 date 34 Y m d 34 strtotime 34 1 day 34 明天 date 34 Y
  • 信号量和互斥锁的区别

    信号量和互斥锁 xff1a 信号量 xff08 semaphore sem f r xff09 用在多线程多任务同步的 xff0c 一个线程完成了某一个动作就通过信号量告诉别的线程 xff0c 别的线程再进行某些动作 而互斥锁 xff08
  • VLC生成流媒体实时流

    VLC生成实时流 xff0c 分为以下步骤 1 打开VLC xff0c 如果未下载可在官网下载 2 现在将要产生流的视频文件选中 3 开始产生流 4 检验流的生成 转载请注明出处 xff1a http www wolfnx com 2017
  • nmap 缺少module 'citrixxml'以及citrixxml.lua的修补

    当使用nmap的 script功能时 xff0c 可以参考nmap脚本使用总结 xff0c 但是在ubuntu12 04 LTS下使用默认下载安装的nmap xff08 版本为5 21 xff09 时 xff0c 当运行nmap scrip
  • 【ROS】Ubuntu18.04安装IntelRealsense D435

    参考文章 xff1a 文章一 文章二 这两篇文章多多少少和自己的有点不一样 xff0c 故在此记录 以实际为准 从官网https github com IntelRealSense librealsense下载安装包 xff08 用git的
  • 利用ROS同时采集激光雷达、摄像头数据并提取信息

    利用ROS同时采集激光雷达 摄像头数据并提取信息 在实际工程中 xff0c 往往需要采集lidar和camera的信息 xff0c 并进行同步 xff0c 而二者的频率往往不一致 xff0c 比如相机的采集频率为30HZ xff0c 而ve
  • C#连接SQLserver数据库

    导入命名空间 span class token keyword using span span class token namespace System span class token punctuation span Configura
  • MTK编译记录

    MTK编译记录 系统编译1 Q FAILED check kernel config 系统编译 1 Q FAILED check kernel config bin bash c python device mediatek build b
  • Git回退到指定版本

    Git版本回退 xff0c 在idea中不方便操作 xff0c 需进行强制提交 主要使用reset和push f进行强制回退 1 git 命令行回退到某个指定的版本 1 在开发过程中遇到合并别人的代码或者合并主分支的代码导致自己的分支代码冲
  • 四旋翼无人机crazepony烧写流程

    开源crazepony 自上而下 xff0c 从产品到底层的学习方法是效率比较高的 事前准备 xff1a 编译stm程序用的是Keil 5 xff0c 官方推荐用5不用4 4不支持Unicode8 xff0c 怕是不支持中文输入 在用官方包
  • deb 打包、安装、卸载

    deb 打包 安装 卸载 deb 格式是 Debian 系统 包含 Debian 和 Ubuntu 专属安装包格式 dpkg 是 Debian下的包管理工具 xff0c 用来执行软件包的打包 解包 安装 卸载等命令 运行环境 xff1a D
  • Kafka高可用 — KRaft集群搭建

    Apache Kafka Raft 是一种共识协议 xff0c 它的引入是为了消除 Kafka 对 ZooKeeper 的元数据管理的依赖 xff0c 被社区称之为 Kafka Raft metadata mode xff0c 简称 KRa
  • python线程池ThreadPoolExecutor的用法

    为了释放python GIL锁实现多个任务的并发运行 xff08 实际上并非真正的并行只是看起来并发 xff09 xff0c 往往采用多线程或者线程池的方式来实现 从Python3 2开始 xff0c concurrent futures模
  • 结构化数据、半结构化数据、非结构化数据的对比

    结构化数据 结构化数据是指可以使用关系型数据库表示和存储 xff0c 表现为二维形式的数据 一般特点是 xff1a 数据以行为单位 xff0c 一行数据表示一个实体的信息 xff0c 每一行数据的属性是相同的 举一个例子 xff1a idn
  • IoU(交并比)的理解及python实现

    1 概述 交并比 Intersection over Union IoU 是目标检测 语义分割 追踪等任务最常用的评估指标 交并比 xff0c 顾名思义是两区域交集与并集的比值 xff0c 当两区域完全重叠时交并比最大 xff0c 为1 x
  • 【复盘】2022年下半年软考·信息系统项目管理师

    题目简析 xff1a 上午选择题 xff1a 考得很分布 xff0c 十四五规划内容考了很多 xff0c 教材上的内容还是十三五 预估分45分 xff0c 一定能过 下午案例分析题 xff1a 三个题都不是十拿九稳的 xff08 特别是计算
  • pybind11 的 Hello World

    pybind11是一个轻量级的仅头文件库 xff0c 主要用于创建现有C 43 43 代码的Python绑定 Github地址 xff1a https github com pybind pybind11 官方文档 xff1a https
  • Flask 中使用 WebSocket 通信

    WebSocket 是一种计算机通信协议 xff0c 通过单个 TCP 连接提供全双工通信信道 WebSocket 使得客户端和服务器之间的数据交换变得更加简单 xff0c 允许服务端主动向客户端推送数据 在WebSocket API 中