Python3 如何实现 websocket 服务?
Python 实现 websocket 服务很简单,有很多的三方包可以用,我从网上大概找到三种常用的包:websocket、websockets、Flask-Sockets。
但这些包很多都“年久失修”, 比如 websocket 在 2010 年就不维护了。

而 Flask-Sockets 也在 2016 年停止维护。

这也给我们提了一个醒,用三方包的时候一定要看下这个包是否还在持续维护,如果作者已经停止了维护,那就坚决不要再用了,因为过不了多久你就会吃个大亏的。
websockets
排除了两个已经不维护的包,现在只剩下一个 websockets 了,那么这个包会满足我们的需求吗?
首先看了下 websockets,发现社区最近还在维护,而且 websockets 还有完整的源码和使用教程,对新手非常友好。



源码和教程地址:
https://pypi.org/project/websockets/
https://github.com/python-websockets/websockets
https://websockets.readthedocs.io/en/stable/intro/tutorial1.html
示例:
service.py
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-import asyncio
import websocketsasync def hello(websocket):recv_data = await websocket.recv()print('<<< %s' % recv_data)send_data = 'Hello %s' % recv_dataawait websocket.send(send_data)print('>>> %s' % send_data)async def start():print('Server started ...')async with websockets.serve(hello, '0.0.0.0', 8765):await asyncio.Future()if __name__ == '__main__':asyncio.run(start())
client.py
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-import asyncio
import websocketsasync def hello():uri = 'ws://0.0.0.0:8765'async with websockets.connect(uri) as websocket:send_data = input("What's your name: ")await websocket.send(send_data)print('>>> %s' % send_data)recv_data = await websocket.recv()print('<<< %s' % recv_data)if __name__ == '__main__':asyncio.run(hello())
这样就是个简单的 WebSocket 服务器/客户端程序了,也是 WebSocket 中最核心的东西了。
运行结果:


但是这样有一个问题,服务器在收到一条消息之后就关闭连接,如果想实现持久连接就需要用到循环来处理了。
async with websockets.connect(uri) as websocket:for i in range(10):send_data = input("What's your name: ")...
如果用到异步需要加上 async:
async def handler(websocket):async for message in websocket:print(message)
有时候可能还会出现一次只能有一个客户端连接的问题,一般来说,这是程序中时间的调用没有使用异步导致。
例如,此连接处理程序可阻止事件循环在一秒钟内运行:
async def handler(websocket):time.sleep(1)...
将其更改为:
async def handler(websocket):await asyncio.sleep(1)...
如何开启多进程?
如果想开启多进程,可以用 Python 自带的包实现,先导入进程池模块,然后启动所有进程,多进程用法参考 Python3 多进程编程 这篇文章。
from multiprocessing import Pool...def main():asyncio.run(start())if __name__ == '__main__':p = Pool(30)for i in range(10):p.apply_async(main)p.close()p.join()...
更多技巧和常见问题请参考:https://websockets.readthedocs.io/en/stable/faq/server.html
相关文章:
Python3 如何实现 websocket 服务?
Python 实现 websocket 服务很简单,有很多的三方包可以用,我从网上大概找到三种常用的包:websocket、websockets、Flask-Sockets。 但这些包很多都“年久失修”, 比如 websocket 在 2010 年就不维护了。 而 Flask-Sockets 也在 2…...
SQLAlchemy常用数据类型
目录 SQLAlchemy常用数据类型 代码演示 代码分析 SQLAlchemy常用数据类型 SQLAlchemy 是一个Python的SQL工具库和对象关系映射(ORM)工具,它提供了一种在Python中操作数据库的高效方式。下面是SQLAlchemy中常用的一些数据类型: Integer:整形&…...
Vue路由与nodejs下载安装及环境变量的配置
目录 前言 一、Vue路由 1.路由简介 是什么 作用 应用场景 2.SPA简介 SPA是什么 SPA的优点 注意事项 3.路由实现思路 1.引入路由的js依赖 2.定义组件 3.定义组件与路径的对应关系 4.通过路由关系获取路由对象router 5.将路由对象挂载到实例中 6.触发路由事…...
HarmonyOS之 应用程序页面UIAbility
一 UIAbility介绍: 1.1 UIAbility是一种包含用户界面的应用组件,主要用于和用户进行交互 1.2 UIAbility也是系统调度的单元,为应用提供窗口在其中绘制界面 二 UIAbility跳转和传参 2.1 页面间的导航可以通过页面路由router模块来实现。页…...
数据集笔记: Porto
数据来源:Taxi Trajectory Data_数据集-阿里云天池 (aliyun.com) 1 数据介绍 葡萄牙波尔图市运行的所有442辆出租车的全年轨迹(从2013年7月1日至2014年6月30日) 2 读取数据 import pandas as pdtrapd.read_csv(C:/Users/16000/Download…...
修改vscode底部栏背景和字体颜色
修改vscode底部栏背景和字体颜色 如图: 首先打开齿轮,打开设置搜索workbench.colorCustomizations,然后点击编辑setting.json修改setting.json内内容 "workbench.colorCustomizations": {"statusBar.foreground": "#FFFFFF…...
加速企业AI实施:成功策略和效率方法
文章目录 写在前面面临的挑战MlOps简介好书推荐 写作末尾 写在前面 作为计算机科学领域的一个关键分支,机器学习在当今人工智能领域中占据着至关重要的地位,广受瞩目。机器学习通过深入分析大规模数据并总结其中的规律,为我们提供了解决许多…...
【图论C++】树的重心——教父POJ 3107(链式前向星的使用)
》》》算法竞赛 /*** file * author jUicE_g2R(qq:3406291309)————彬(bin-必应)* 一个某双流一大学通信与信息专业大二在读 * * brief 一直在竞赛算法学习的路上* * copyright 2023.9* COPYRIGHT 原创技术笔记:转载…...
hhh百度地铁广告太搞笑了;24家国内大模型公司面经;LLM法律应用实践;AI+教育产品图谱与工作流 | ShowMeAI日报
👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 🔥 会玩儿!承包地铁专列,真人移动广告 | 百度世界大会预热 百度也是会玩儿!承包了北京地铁一号线的「…...
项目管理:项目经理一定要避开这四大误区
项目经理要保质保量按时达成项目目标,需要关注项目的方方面面,要具有很强的沟通协调能力和目标意识。但是项目经理也不免不了失误,管理中的这四大误区,你经历过几个? 误区一:做不该做的事 你是否遇到这种…...
爬虫为什么需要 HTTP 代理 IP?
前言 爬虫在互联网数据采集、分析和挖掘中扮演着至关重要的角色,但是对于目标网站而言,频繁的爬虫请求可能会对其服务器产生不小的负担,严重的情况甚至会导致网站崩溃或者访问受限。为了避免这种情况的发生,同时也为了保护客户端…...
leetcode刷题笔记/代码随想录笔记——移除字符串中多余空格
1. 使用erase()函数 void removeExtraSpaces(string& s) {for (int i s.size() - 1; i > 0; i--) {if (s[i] s[i - 1] && s[i] ) {s.erase(s.begin() i);}}// 删除字符串最后面的空格if (s.size() > 0 && s[s.size() - 1] ) {s.erase(s.begi…...
dataGrip导出导入的方式
导出:选中需要导出的表 导入:选中导出的sql文件...
LeetCode279. 完全平方数
279. 完全平方数 文章目录 [279. 完全平方数](https://leetcode.cn/problems/perfect-squares/)一、题目二、题解方法一:完全背包二维数组方法二:一维数组(空间复杂度更小的改进版本,最下面的两个版本不需要存储完全平方数) 一、题…...
【CMake】add_dependencies 命令
【CMake】add_dependencies 原文链接:https://blog.csdn.net/new9232/article/details/125831009 参考链接:https://blog.csdn.net/new9232/article/details/121374943 简介 add_dependencies(<target> [<target-dependency>]...)官方文档…...
go语言unsafe.Pointer与uintptr
以下内容来源go语言圣经 1、unsafe.Pointer,相当于c语言中的void *类型的指针,如果需要运算需要转成uintptr类型的指针 2. uintptr uintptr是一个无符号的整型,它可以保存一个指针地址。 它可以进行指针运算。 uintptr无法持有对象, GC不把…...
ddos打到高防cdn上会发生什么
ddos打到cdn上会发生什么?当DDoS攻击打到CDN上时,肯定会影响网站的可用性和用户体验。具体DDoS攻击打到CDN上时,会发生以下情况: CDN节点负载增加:DDoS攻击会导致大量的无效流量涌入CDN节点,从而使得节点负载增加。这…...
【单调栈】503. 下一个更大元素 II
503. 下一个更大元素 II 解题思路 参考496. 下一个更大元素 I 首先计算nums2的每一个元素的下一个比他大的元素,使用单调栈 将上面的结果和nums2中的每一个元素组成映射map 针对每一个Nums1的元素 查询map 记录map 的value 但是这个是循环的数组元素 class So…...
C++ decltype类型
文章目录 1. 工作原理2. decltype 变量3. decltype 表达式4. decltype 函数 1. 工作原理 随着程序越来越复杂,程序中用到的类型也越来越多,我们有时候不得不去翻阅大量上下文去寻找此数据的类型。 decltype就是一种类型说明符,它的出现…...
【题解】JZOJ3854 分组
JZOJ 3854 题意 有 n n n 个人,每个人有地位 r i r_i ri 和年龄 a i a_i ai,对于一个若干人组成的小组,定义其队长为地位最高的成员(若相等则取二者均可),其他成员的年龄与队长的差不能超过 k k …...
如何通过LibreHardwareMonitor实现高效全面的硬件监控:实用指南
如何通过LibreHardwareMonitor实现高效全面的硬件监控:实用指南 【免费下载链接】LibreHardwareMonitor Libre Hardware Monitor, home of the fork of Open Hardware Monitor 项目地址: https://gitcode.com/GitHub_Trending/li/LibreHardwareMonitor Libre…...
Qwen3-Reranker-0.6B效果展示:中英术语对照表构建中的跨语言排序
Qwen3-Reranker-0.6B效果展示:中英术语对照表构建中的跨语言排序 1. 跨语言术语排序的技术挑战 在全球化信息时代,构建准确的中英术语对照表已成为跨语言交流、技术文档翻译和国际合作的重要基础。传统方法往往面临几个核心痛点: 语义鸿沟…...
如何通过FCEUX实现NES游戏高精度模拟?解锁经典游戏的数字化体验
如何通过FCEUX实现NES游戏高精度模拟?解锁经典游戏的数字化体验 【免费下载链接】fceux FCEUX, a NES Emulator 项目地址: https://gitcode.com/gh_mirrors/fc/fceux 你是否曾因找不到可靠的NES模拟器而无法重温童年经典游戏?是否遇到过模拟器兼容…...
大致说一下spring bean的生命周期
面试 1、实例化 Bean 2、给 Bean 属性赋值 3、初始化 Bean 4、使用 Bean 5、销毁 Bean package com.example.demo.bean;import jakarta.annotation.PostConstruct; import jakarta.annotation.PreDestroy; import org.springframework.beans.factory.annotation.Value; import …...
ChatClient 全家桶保姆级博客讲解
最近 Spring AI 迭代很快,从原来的 ChatModel 转向了更易用的 ChatClient API。如果你看到这串名词:ChatClient、default、Options、Functions、Tools、System&User、Advisors,肯定会说好多名词啊。不急,慢慢来。一、先搞懂&a…...
Llama-3.2V-11B-cot应用落地:农业病虫害图谱跨季节推理验证系统
Llama-3.2V-11B-cot应用落地:农业病虫害图谱跨季节推理验证系统 1. 项目背景与价值 农业病虫害防治一直是农业生产中的重大挑战。传统方法依赖人工观察和经验判断,存在效率低、准确性不足等问题。Llama-3.2V-11B-cot多模态大模型为解决这一难题提供了创…...
Eye-in-Hand还是Eye-to-Hand?深入解读OpenCV手眼标定背后的四种经典算法(Tsai, Park, Horaud)
Eye-in-Hand还是Eye-to-Hand?深入解读OpenCV手眼标定背后的四种经典算法 在工业机器人视觉引导系统中,相机与机械臂的精确标定直接决定了整个系统的定位精度。当工程师第一次调用OpenCV的calibrateHandEye()函数时,面对CALIB_HAND_EYE_TSAI、…...
开源工具Cowabunga Lite:iOS设备零门槛个性化方案全解析
开源工具Cowabunga Lite:iOS设备零门槛个性化方案全解析 【免费下载链接】CowabungaLite iOS 15 Customization Toolbox 项目地址: https://gitcode.com/gh_mirrors/co/CowabungaLite 在iOS生态系统中,用户对设备个性化的需求与系统封闭性之间始终…...
告别Redis?在CentOS 7上快速体验国产TongRDS 2.2.x(附与SpringBoot整合对比)
国产内存数据库TongRDS技术评估与SpringBoot整合实战 在技术架构选型的关键时刻,国产基础软件的成熟度与性能表现成为越来越多企业关注的焦点。作为Redis的潜在替代方案,TongRDS凭借其纯Java架构和与Redis协议的高度兼容性,正在技术社区引发热…...
从零到一实战:基于快马平台快速开发企业级jiyutrainer在线评测系统
今天想和大家分享一个很实用的开发经验——如何快速搭建一个企业级的在线编程评测系统。最近正好有个朋友想做一个类似jiyutrainer的编程练习平台,我就用InsCode(快马)平台试了试,效果出乎意料的好。 项目需求分析 首先明确我们需要实现的核心功能&#…...
