位置: 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获取元素)

  • 2017三大数字营销趋势!营销人的必修课!(数字营销机构排名)

    2017三大数字营销趋势!营销人的必修课!(数字营销机构排名)

  • 苹果13是typec接口吗

    苹果13是typec接口吗

  • 小米12尺寸长宽高(小米12多大屏幕)

    小米12尺寸长宽高(小米12多大屏幕)

  • ipad2021充电器多少w(ipad2021充电器多少)

    ipad2021充电器多少w(ipad2021充电器多少)

  • 红米10xpro机身的长宽高分别是多少(红米10xpro rom)

    红米10xpro机身的长宽高分别是多少(红米10xpro rom)

  • vivos1是玻璃机身吗(vivos7是玻璃机身吗)

    vivos1是玻璃机身吗(vivos7是玻璃机身吗)

  • 苹果怎么恢复出厂设置删除所有东西(苹果怎么恢复出厂设置会怎么样)

    苹果怎么恢复出厂设置删除所有东西(苹果怎么恢复出厂设置会怎么样)

  • 爱国福怎么才能扫到(爱国福怎么得到的2020)

    爱国福怎么才能扫到(爱国福怎么得到的2020)

  • 微信好友标签怎么删除(微信好友标签怎么删除不了)

    微信好友标签怎么删除(微信好友标签怎么删除不了)

  • 自动目录1和自动目录2有什么区别(自动目录1和自动目录2怎么恢复)

    自动目录1和自动目录2有什么区别(自动目录1和自动目录2怎么恢复)

  • 华为 pro是什么意思(华为手机pro是啥意思)

    华为 pro是什么意思(华为手机pro是啥意思)

  • 网上买的手机实体店保修吗(网上买的手机实体店会帮忙上传一些更换手机的资料吗)

    网上买的手机实体店保修吗(网上买的手机实体店会帮忙上传一些更换手机的资料吗)

  • 华为nova7se导航键怎么设置(华为nova7设置导航)

    华为nova7se导航键怎么设置(华为nova7设置导航)

  • 苹果8p左上角阴影会扩大吗(苹果8p左上角阴影怎么解决)

    苹果8p左上角阴影会扩大吗(苹果8p左上角阴影怎么解决)

  • 苹果手机播放不了视频怎么办(苹果手机播放不了qq音乐)

    苹果手机播放不了视频怎么办(苹果手机播放不了qq音乐)

  • 为什么ipad微信朋友圈不能发视频(为什么ipad微信朋友圈发不了视频)

    为什么ipad微信朋友圈不能发视频(为什么ipad微信朋友圈发不了视频)

  • 音响前级后级什么意思(音响中前级和后级指的是哪些东西)

    音响前级后级什么意思(音响中前级和后级指的是哪些东西)

  • 开机设置在那(开机选项怎么设置方法)

    开机设置在那(开机选项怎么设置方法)

  • 抖音怎么添加淘宝链接(抖音怎么添加淘宝联盟的商品)

    抖音怎么添加淘宝链接(抖音怎么添加淘宝联盟的商品)

  • 摄像头mp和p的区别(摄像机的mp是什么意思)

    摄像头mp和p的区别(摄像机的mp是什么意思)

  • vivox9splus怎么出厂设置(vivo x9如何)

    vivox9splus怎么出厂设置(vivo x9如何)

  • xs支持多少瓦快充(xs最多支持多少瓦充电)

    xs支持多少瓦快充(xs最多支持多少瓦充电)

  • 小米有品有鱼是什么(小米有品有鱼是真的吗)

    小米有品有鱼是什么(小米有品有鱼是真的吗)

  • 华为推拉屏手机是哪款(华为拉伸屏手机)

    华为推拉屏手机是哪款(华为拉伸屏手机)

  • aplog设置是什么(华为aplog设置是什么)

    aplog设置是什么(华为aplog设置是什么)

  • wetool怎么加人(wetool怎么加群)

    wetool怎么加人(wetool怎么加群)

  • 华为畅享9e和9的区别(华为畅享9e和9的对比)

    华为畅享9e和9的区别(华为畅享9e和9的对比)

  • 电脑连接网线但是无法上网(电脑连接网线但没有网络)

    电脑连接网线但是无法上网(电脑连接网线但没有网络)

  • billmind.exe是什么进程 billmind进程有何作用(bill是什么软件)

    billmind.exe是什么进程 billmind进程有何作用(bill是什么软件)

  • hwinfo命令  查询硬件信息(使用命令查看)

    hwinfo命令 查询硬件信息(使用命令查看)

  • 递延所得税资产会计处理全过程
  • 进口增值税的税率
  • 哪些税种属于中央固定收入
  • 季度申报,其他收益科目是怎样的科目
  • 社保局发放的稳岗补贴怎么入账
  • 金税盘怎么添加领票人
  • 增值税税率调整为9%
  • 购房补贴退契税3个月没到账
  • 先进技术企业的企业所得税税率
  • 增值税认证逾期怎么处理
  • 一般纳税人租赁费的税率是多少
  • 公司成立后有哪些开支
  • 每股收益的无差别点小于息税前利润选择什么筹资方式
  • 金税系统年度维护费发票抵扣需要认证吗?
  • 个税申报系统中年收入不超6万元的确认错了怎么改
  • 印花税购销比例
  • 建材公司将自产产品卖出
  • 小微企业必须给员工缴纳哪些保险
  • 代收代付水电费会计分录
  • 对公账户上扣缴的税怎么做分录?
  • 研发费用的检测费指的是什么内容
  • 银行要求的补偿性余额所占比例为20%
  • 归属于母公司的净利润怎么来的?
  • 新的成品油消费税纳税申报表有什么变化?
  • 应交税费已交税金借方有余额
  • 复核内容有哪些?
  • 期初银行余额有误怎么调分录怎么写
  • 其他货币资金包括哪些内容
  • 协调费用应该怎么表述才合理
  • 收到发票已入账什么意思
  • 客户申请退款商家拒绝退货退款会有什么效果
  • echarts饼图背景图片
  • 木星应该涂什么颜色
  • 若依框架搭建
  • 事业单位包含哪些
  • 空调维修费进什么会计科目
  • yolo v1 pytorch源代码
  • 制造费用期末有余额怎么处理
  • package.json详解
  • 阿里月薪3万到手多少
  • css3的模块结构和应用
  • php使用什么开发工具
  • 会计科目借贷方向图表
  • 外贸出口企业的税务风险
  • mongodb import
  • mongodb部署安装
  • 内帐税金会计分录
  • 土地增值税的计算方法公式
  • 金税盘税务申报流程
  • 运输途中发生的合理损失
  • 实收资本的入账金额包括消费税吗
  • 购买银行承兑汇票贴现诈骗
  • 新旧会计准则的科目区别
  • 房地产开发企业建造的商品房,在出售前
  • 营销策划费用是
  • 发票冲红如何做账红字发票需要给购买方吗
  • 小规模纳税人收到专票的会计分录
  • 企业给职工提供的免费住房是不是合法住宅?
  • 幼儿园固定资产一览表
  • mysql数据库-数据库和表的基本操作
  • iis配置asp网站
  • win8系统计算器快捷键
  • windows使用svn命令
  • win8.1语言设置
  • win10账户登录闪退
  • cocos2d-x起点之程序的入口
  • unity优化方案
  • qt opengl obj
  • jquery判断控件是否存在
  • 安卓开发解析xml
  • 请问在javascript程序中
  • js div拖动
  • android 蓝牙数据传输
  • python嵌套列表怎么遍历
  • 安徽省国家税务总局电子税务局
  • 公共基础设施项目目录
  • 国税 地税比例
  • 一般纳税人企业所得税怎么征收
  • 甘肃省国家税务局电子税务局
  • 土地使用税征收时间
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设