位置: IT常识 - 正文

由浅入深介绍 Python Websocket 编程(由浅入深英语怎么说)

编辑:rootadmin
由浅入深介绍 Python Websocket 编程 目录1. 为什么使用 Websocket ?1.1 websocket 协议简介1.2 基本原理2. 如何用 Python 搭建 Websocket 服务2.1 安装websockets包2.2 编写 server 端代码3. Python websocket 客户端实现代码4. Javascript websocket 客户端实现代码5. 测试websocket6. 服务器向客户端广播消息1. 为什么使用 Websocket ?1.1 websocket 协议简介

推荐整理分享由浅入深介绍 Python Websocket 编程(由浅入深英语怎么说),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:由浅入深的话题,由浅入深英语,由浅入深英语翻译,由浅入深英语怎么说,由浅入深英语怎么说,由浅入深介绍了,由浅入深介绍了,由浅入深介绍了,内容如对您有帮助,希望把文章链接给更多的朋友!

Websocket协议是对http的改进,可以实现client 与 server之间的双向通信; websocket连接一旦建立就始终保持,直到client或server 中断连接,弥补了http无法保持长连接的不足,方便了客户端应用与服务器之间实时通信。

适用场景html页面实时更新, 客户端的html页面内,用` javascript` 与 server 建立websocket连接,实现页面内容的实时更新。Websocket 非常适合网页游戏、聊天、证券交易等实时应用。要求保持长连接的实时通信的应用场景。 如基于位置的服务应用,物联网,多方协作软件,在线教育,带社交属性的手机APP等。

实时更新数据场景,为什么不使用AJAX? AJAX 采用http, 如果要实时更新页面,则需要不断地发送http 请求,无论是否有数据更新,产生大量冗余通信流量。而websocket是长连接双向通信,有数据更新时,服务器向客户机发送通知。

1.2 基本原理

基于TCP,一次握手就能建立连接,支持双向通信,可保持长连接。

WebSocket 握手请求消息示例::

GET /chat HTTP/1.1Host: normal-website.comSec-WebSocket-Version: 13Sec-WebSocket-Key: wDqumtseNBJdhkihL6PW7w==Connection: keep-alive, UpgradeCookie: session=KOsEJNuflw4Rd9BDNrVmvwBF9rEijeE2Upgrade: websocket

如果 Server 接收连接,返回响应

HTTP/1.1 101 Switching ProtocolsConnection: UpgradeUpgrade: websocketSec-WebSocket-Accept: 0FFP+2nmNIf/h+4BP36k9uzrYGk=

响应码为101,表示切换为websocket 协议。

websocket 已得到主流浏览器,各编程语言的广泛支持,基本都提供了WebSocket高阶编程API,在一般场合下,可以替代socket低阶函数编程。python 提供了更简洁的编程实现方式。下面展示了实例代码方式,说明如何开发 Python websocket 服务器代码,python websocket 客户端, 以及javascript websocket 代码。

2. 如何用 Python 搭建 Websocket 服务

python 第3方库 websockets 提供了websocket 实现框架,支持asyncio, 性能强大,稳定性好,可以用于生产环境。

2.1 安装websockets包pip install websockets2.2 编写 server 端代码

Websocket服务端代码是面向多用户的长连接,因此本文采用了python3.7 版本的 asyncio 异步方式编写 websocket server 代码。

服务端也可使用 ThreadPoolExecutor 线程池方式同时处理多连接的场景,用户较多时,性能明显不如asyncio异步方式。

websockets 模块 server端的主要方法:

recv() 收消息send() 发送消息serve() 创建 server 对象由浅入深介绍 Python Websocket 编程(由浅入深英语怎么说)

实现步骤:

编写websocket 异步任务处理函数handler创建1个websocket server 对象异步运行 server对象

websocket 地址格式:

ws://主机地址:端口号wss://主机地址:端口号, wss表示此连接为https 连接。

下面是具体的代码 server.py

#!/usr/bin/python3# 主要功能:创建1个基本的websocket server, 符合asyncio 开发要求import asyncioimport websocketsfrom datetime import datetimeasync def handler(websocket): data = await websocket.recv() reply = f"Data received as \"{data}\". time: {datetime.now()}" print(reply) await websocket.send(reply) print("Send reply")async def main(): async with websockets.serve(handler, "localhost", 9999): await asyncio.Future() # run foreverif __name__ == "__main__": asyncio.run(main())

服务端handler函数代码还有1种写法,适用性更好。

async def handler(websocket): async for message in websocket: reply = f"Data received as \"{message}\". time: {datetime.now()}" print(reply) await websocket.send(reply)

Websocket协议本身有心跳机制、连接检测机制,服务端无须关心客户端状态,一旦有异常,会自动断开连接。

Websockets提供了交互式测试命令,现在可以快速测试一下服务端是否能正常工作: (1) 启动服务器: python server.py (2) 通过命令行连接服务端,并向发送hello, world 消息,可以看到,收到了服务器的响应。

D:\workplace\python\projects\websock>python -m websockets ws://localhost:9999Connected to ws://localhost:9999.> hello, world< Data received as "hello, world". time: 2023-04-01 09:24:14.787357Connection closed: 1000 (OK).

当然实际应用时,应按下面步骤来编写客户端代码。

3. Python websocket 客户端实现代码

websockets 客户端提供的主要方法:

connect() 建立与服务器的连接recv(), send() 收发消息close() 显式地关闭连接

下面看一下示例 client.py

import asyncioimport websocketsimport timeasync def ws_client(url): for i in range(1, 40): async with websockets.connect(url) as websocket: await websocket.send("Hello, I am PyPy.") response = await websocket.recv() print(response) time.sleep(1)asyncio.run(ws_client('ws://localhost:9999'))4. Javascript websocket 客户端实现代码

目前主流的浏览器都支持websocket协议。

Javascript websocket 对象的主要属性与方法: 请参考菜鸟教程的这篇文章:https://www.runoob.com/html/html5-websocket.html

示例代码: client.html

<!DOCTYPE HTML><html><head> <meta charset="utf-8"> <title>websocket demo</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/css/bootstrap.min.css"><script src="https://cdn.staticfile.org/jquery/3.2.1/jquery.min.js"></script><script src="https://cdn.staticfile.org/popper.js/1.15.0/umd/popper.min.js"></script> <script src="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/js/bootstrap.min.js"></script> <script type="text/javascript"> function WebSocketTest() { text = document.getElementById("div_text"); if ("WebSocket" in window) { // 打开一个 web socket var ws = new WebSocket("ws://localhost:9999/handler"); ws.onopen = function () { // Web Socket 已连接上,使用 send() 方法发送数据 ws.send("Javscript发送的数据"); text.innerHTML = "数据发送中..."; alert("数据发送中..."); }; ws.onmessage = function (evt) { var received_msg = evt.data; text.innerHTML = "收到的数据:" + received_msg; alert("数据已接收..."); }; ws.onclose = function () { // 关闭 websocket text.innerHTML = "连接已关闭..."; alert("连接已关闭..."); }; } else { // 浏览器不支持 WebSocket alert("您的浏览器不支持 WebSocket!"); } } </script></head><body> <div class="col-md-6 m-5 p-2" id="div_ws"> <a class="btn btn-primary" href="javascript:WebSocketTest()">连接WebSocket</a> </div> <div class="col-md-6 border border-primary mx-5 p-2 " id="div_text" style="margin:20px;height:100px;"> display communicate text </div></body></html>5. 测试websocket

上述3个文件都放在同1个目录下,打开两个终端窗口,先运行server.py, 再运行 client,py。 Output结果 在chrome 或edge 中运行client.html, 可以看到websocket 连接建立,发送,接收,关闭各阶段的状态。 能够看到,服务器与客户端之间的通信是双向的,而且是长连接,客户端断开后,服务器仍然保持侦听状态,而且不需要accept操作。websocket发送、接收文件也不需要 socket 对发送窗口 buffer 进行控制,因此是 socket 开发非常好的替代。

注:Python异步websocket服务器最终性能与代码质量、服务器硬件、网络等紧密相关,可以使用 Websocket-benchmarker 测试工具来测试服务器。

6. 服务器向客户端广播消息

websockets 模块支持向所有连接的客户广播消息, 用1个简单的例子来演示,实现步骤:

保存每个 websocket 客户连接向每个客户发送消息

将前面的server,.py 代码修改后如下:

#!/usr/bin/python3# 主要功能:创建1个基本的websocket server, 符合asyncio 开发要求import asyncioimport websocketsfrom datetime import datetimeCONNECTIONS = set()async def send(websocket, message): try: await websocket.send(message) except websockets.ConnectionClosed: passasync def broadcast(message=""): # 向队列中的每个连接发送消息, 广播10次 for i in range(0,10): message = f"Broadcast: New user joined, now time is {datetime.now()}" if CONNECTIONS : # asyncio.wait doesn't accept an empty list await asyncio.wait([ asyncio.create_task(send(websocket, message)) for websocket in CONNECTIONS ]) await asyncio.sleep(30) #每次广播间隔async def handler(websocket): CONNECTIONS.add(websocket) # 保存客户连接至集合 try: # do other things await websocket.wait_closed() finally: CONNECTIONS.remove(websocket)async def main(): async with websockets.serve(handler, "localhost", 9998): await asyncio.Future() # run forever loop = asyncio.get_running_loop() #获取当前event_loop对象 loop.create_task(broadcast()) # 添加新的异步广播任务if __name__ == "__main__": asyncio.run(main())

注: 本例broadcast() 方法每30秒,就向全部用户发送广播。实际应用时可以保持永久循环

本文链接地址:https://www.jiuchutong.com/zhishi/296087.html 转载请保留说明!

上一篇:HTTP 错误 500.19- Internal Server Error 错误解决方法

下一篇:vue3使用nextTick(vue3使用ref获取元素)

  • 酷狗下载的歌曲在哪个文件夹(酷狗下载的歌曲到u盘怎么不能听)

    酷狗下载的歌曲在哪个文件夹(酷狗下载的歌曲到u盘怎么不能听)

  • b社是哪个公司(b社全称)

    b社是哪个公司(b社全称)

  • 荣耀7x屏幕翘起能粘上吗(荣耀7x手机屏幕翘起来了)

    荣耀7x屏幕翘起能粘上吗(荣耀7x手机屏幕翘起来了)

  • 启动项命令是什么(启动项 运行)

    启动项命令是什么(启动项 运行)

  • 抖音没有粉丝怎么办(抖音没有粉丝怎么变现)

    抖音没有粉丝怎么办(抖音没有粉丝怎么变现)

  • oppo有红外遥控功能吗(oppo红外遥控在哪)

    oppo有红外遥控功能吗(oppo红外遥控在哪)

  • 新ipadpro可以用一代笔吗(新ipad pro能用一代pencil吗)

    新ipadpro可以用一代笔吗(新ipad pro能用一代pencil吗)

  • 微信添加到通讯录为什么直接就通过了(微信添加到通讯录对方会收到信息吗)

    微信添加到通讯录为什么直接就通过了(微信添加到通讯录对方会收到信息吗)

  • 笔记本电脑声卡在哪(笔记本电脑声卡怎么安装)

    笔记本电脑声卡在哪(笔记本电脑声卡怎么安装)

  • qq发起通话失败是什么原因

    qq发起通话失败是什么原因

  • 微信白名单是什么(白名单微信号)

    微信白名单是什么(白名单微信号)

  • 路由器时间长了信号不好怎么办(路由器时间长了会导致网速变慢吗)

    路由器时间长了信号不好怎么办(路由器时间长了会导致网速变慢吗)

  • vivox27视频美颜怎么没有了(vivox27视频美颜怎么弄微信)

    vivox27视频美颜怎么没有了(vivox27视频美颜怎么弄微信)

  • 小米手机媒体音量没声音怎么办(小米手机媒体音量突然变小怎么办)

    小米手机媒体音量没声音怎么办(小米手机媒体音量突然变小怎么办)

  • 小米9为什么动不动黑屏(小米为什么动态壁纸无故消失)

    小米9为什么动不动黑屏(小米为什么动态壁纸无故消失)

  • 手机免打扰模式怎么关(手机免打扰模式怎么取消)

    手机免打扰模式怎么关(手机免打扰模式怎么取消)

  • 华为怎么解除激活模式(华为怎么解除激活设备)

    华为怎么解除激活模式(华为怎么解除激活设备)

  • 魅族16s怎么清理缓存(魅族怎么清理内存)

    魅族16s怎么清理缓存(魅族怎么清理内存)

  • oppo手保险箱在哪里(oppo手机保险箱里的东西如何恢复)

    oppo手保险箱在哪里(oppo手机保险箱里的东西如何恢复)

  • 苹果x带无线耳机吗(苹果x无线耳机多少钱正品)

    苹果x带无线耳机吗(苹果x无线耳机多少钱正品)

  • 苹果未备份的照片怎么恢复(iphone没有备份的照片怎么恢复)

    苹果未备份的照片怎么恢复(iphone没有备份的照片怎么恢复)

  • 苹果xr有3dtouch么

    苹果xr有3dtouch么

  • 钉钉入职表转正怎么填(钉钉转正信息)

    钉钉入职表转正怎么填(钉钉转正信息)

  • 快手怎么粘贴别人昵称(快手怎么粘贴别人昵称教程)

    快手怎么粘贴别人昵称(快手怎么粘贴别人昵称教程)

  • vivox23支持红外线吗(vivox23支持红外遥控空调吗)

    vivox23支持红外线吗(vivox23支持红外遥控空调吗)

  • 首选dns怎么填(首选dns怎么填服务器电信)

    首选dns怎么填(首选dns怎么填服务器电信)

  • expdp/impdp oracle数据泵导入导出

    expdp/impdp oracle数据泵导入导出

  • 收益性支出和资产的区别
  • 个税分类所得税率
  • 印花税什么时候开始计入税金及附加
  • 缴纳城镇土地使用税标准
  • 发票旁边的孔能撕吗
  • 银行的电子退库是什么,怎么做账
  • 开票金额为什么会多出一分钱
  • 同一控制下企业合并取得的长期股权投资
  • 租金收入需要缴增值税吗
  • 出纳都需要做什么表格
  • 留存收益转增资本有什么好处
  • 加工原因造成的废品损失
  • 安全费用支出范围包括
  • 收了款未开票凭证如何做
  • 水利建设专项收入税
  • 水利建设基金的缴费基数是什么
  • 贷款已支付属于什么会计科目
  • 内账一定要权责发生制吗
  • 可以做投标保证金的有银行汇票银行保函
  • 银行年费计入管理费用还是财务费用
  • 增值税专用发票税号错误
  • 倒发票怎么倒出钱来
  • 收款收据怎么写 样本
  • 以无形资产进行投资
  • 激进型和保守型筹资组合怎么判断
  • smss.exe是干嘛的
  • 删掉广告有什么办法
  • windows 11 正式
  • shell检查变量是否为空
  • PHP:pg_version()的用法_PostgreSQL函数
  • 二手房过户需要哪些手续和费用2023
  • 总公司固定资产包括哪些
  • 企业通讯费管理办法
  • 一般纳税人企业所得税税率多少
  • 企业营运资金管理存在的问题
  • 土地增值税清算全流程实战案例
  • 存货捐赠视同销售的会计分录怎么做?
  • 应收账款确认无法收回
  • RTX 4090深度学习性能实测奉上!模型训练可提升60~80%
  • 职工教育经费的计提比例是多少
  • vue跨域的几种方式
  • 跨年度费用发票还可以抵扣所得税吗
  • 新闻管理系统类图
  • php实现多语言切换
  • 简易计税适用什么类型企业
  • 融资租赁固定资产不属于筹资活动
  • 小规模纳税人可以开增值税专用发票吗
  • 采购发票生成的会计凭证
  • mysql的innodb引擎支持外键
  • 文章让修改了就一定会接收吗?
  • 个人社保交错了怎么办
  • 如何在sql server中打开已有数据库
  • 增值税加计扣除最新政策2023
  • 银行承兑汇票如果到期了企业没有兑付
  • 核定征收过了时间就不能申请了吧
  • 增值税期末留抵退税原因采集确认单
  • 租赁房屋怎么做账
  • 公司担保无效的后果
  • 公司收到社保打款怎么办
  • 劳务关系需要交税吗
  • 福利费发票可以抵扣进项税吗
  • 加计扣除是什么时候申报
  • 电影院分成比例
  • 管家婆进货单怎么录入?
  • 金税盘维护费抵减分录
  • 健全的财务会计制度承诺函
  • kvm虚拟机paused
  • macbookair断网
  • wav文件属于什么文件
  • ghost备份1678
  • 微软补丁发布时间
  • opengl纹理采样
  • css实战案例
  • linux脚本case
  • javascript的介绍
  • python 如何访问数据库
  • 税务机关文化建设
  • 广东省国家税务总局稽查局局长
  • 企业以自有物业为单位
  • 小规模纳税人30万免税政策
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设