Python实现WebSocket通讯与心跳控制详解

        为了使用Python实现WebSocket通讯和心跳控制,我们通常需要一个WebSocket客户端库和一个服务器端库。这里,我们将使用websockets库作为服务器和客户端的示例。
安装必要的库

        首先,你需要安装websockets库。可以使用pip进行安装:

pip install websockets

1.服务器端代码

        服务器端将处理WebSocket连接,发送和接收消息,并管理心跳检测。

import asyncio  
import websockets  
import time  HEARTBEAT_INTERVAL = 10  # 心跳间隔(秒)  
HEARTBEAT_TIMEOUT = 30  # 心跳超时(秒)  # 心跳检测字典,存储客户端和它们最后活动时间  
clients = {}  async def heartbeat_task(ws, client_id):  while True:  try:  # 如果客户端在HEARTBEAT_TIMEOUT内没有发送消息,则关闭连接  if time.time() - clients[client_id]['last_active'] > HEARTBEAT_TIMEOUT:  print(f"Client {client_id} timed out, closing connection.")  await ws.close()  break  # 发送心跳消息  await ws.send("heartbeat")  print(f"Sent heartbeat to client {client_id}")  await asyncio.sleep(HEARTBEAT_INTERVAL)  except Exception as e:  print(f"Heartbeat task for client {client_id} failed: {e}")  break  async def echo(websocket, path):  client_id = id(websocket)  # 使用内存地址作为简单的客户端ID  clients[client_id] = {'ws': websocket, 'last_active': time.time()}  # 启动心跳检测任务  asyncio.create_task(heartbeat_task(websocket, client_id))  try:  async for message in websocket:  clients[client_id]['last_active'] = time.time()  # 更新最后活动时间  if message == "ping":  print(f"Received ping from client {client_id}")  await websocket.send("pong")  else:  print(f"Received '{message}' from client {client_id}")  await websocket.send(f"Echo: {message}")  except websockets.exceptions.ConnectionClosed:  print(f"Client {client_id} disconnected")  finally:  # 清理客户端信息  del clients[client_id]  start_server = websockets.serve(echo, "localhost", 8765)  asyncio.get_event_loop().run_until_complete(start_server)  asyncio.get_event_loop().run_forever()

2.客户端代码

        客户端将连接到服务器,接收和发送消息,并响应心跳消息。

import asyncio  
import websockets  
import time  async def client():  uri = "ws://localhost:8765"  async with websockets.connect(uri) as websocket:  while True:  try:  message = input("Enter message to send (or 'exit' to quit): ")  if message == 'exit':  break  await websocket.send(message)  response = await websocket.recv()  print(f"Received: {response}")  # 发送pong消息以响应心跳消息  if response == "heartbeat":  await websocket.send("pong")  # 模拟客户端工作,防止心跳超时  await asyncio.sleep(5)  except websockets.exceptions.ConnectionClosed:  print("Connection closed by server.")  break  asyncio.get_event_loop().run_until_complete(client())

3.运行和测试

        首先运行服务器端代码。
        然后运行客户端代码,并在提示时输入消息。
        观察服务器和客户端的输出,确保它们能够正常通讯,并且心跳控制按预期工作。

        注意:心跳检测的实现是基于一个简单的字典和内存地址作为客户端ID。在实际应用中,你可能需要使用更复杂的机制来跟踪客户端,如使用数据库或分布式缓存。此外,为了简化示例,心跳消息只是简单地发送字符串"heartbeat",并且客户端只是通过发送"pong"来响应。在真实场景中,你可能需要实现更复杂的逻辑来处理心跳。

关注公众号了解更多内容

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

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

相关文章

Modbus TCP转CAN网关在不同行业中的应用以及其使用上的优势

倍讯科技Modbus TCP转CAN网关通常被用于工业自动化领域,特别是在需要连接现有Modbus TCP网络和CAN总线设备的场景中。以下是该网关在不同行业中的应用以及其使用上的优势: 1. 制造业: - 在制造业中,各种类型的设备和机器通常使用不…

PXE+Kickstart无人值守安装安装Centos7.9

文章目录 一、什么是PXE1、简介2、工作模式3、工作流程 二、什么是Kickstart1、简介2、触发方式 三、无人值守安装系统工作流程四、实验部署1、环境准备2、服务端:关闭防火墙和selinux3、添加一张仅主机的网卡4、配置仅主机的网卡4.1、修改网络连接名4.2、配IP地址4…

整合springboot-mybatis时,MySQL数据库无法连接问题

整合springboot-mybatis时,MySQL数据库无法连接问题 解决步骤 先手动停止MySQL服务,在cmd后的控制台输入services.msc 找到MySql停止服务 修改配置文件,跳过验证 修改MySQL安装目录下的my.ini配置文件,使登录时跳过权限检查&a…

业绩超预期外,海尔智家ESG实践再获认可

求增长,已成各行业面对的共同命题。 在家电赛道上,海尔智家的业绩表现不俗。2024一季度,海尔智家延续了年报稳健增长的趋势,继续在高基数下实现高增长,其利润增幅更是高达20.2%,超预期。而今年…

【Web】CTFSHOW 月饼杯 题解(全)

目录 web1_此夜圆 web2_故人心 web3_莫负婵娟 web1_此夜圆 拿到源码&#xff0c;一眼字符串逃逸 本地测一测&#xff0c;成功弹出计算器 <?phpclass a {public $uname;public $password;public function __wakeup(){system(calc);} }function filter($string){retur…

Linux软件RAID:数据冗余与性能提升的完美融合

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Linux &#xff1a;从菜鸟到飞鸟的逆袭》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、前言 1、软件RAID的概念 2、软件RAID与硬件RAID的对比…

记录一下 log4j的漏洞

目录 背景 bug的产生 bug复现 JNDI 网络安全学习路线 &#xff08;2024最新整理&#xff09; 学习资料的推荐 1.视频教程 2.SRC技术文档&PDF书籍 3.大厂面试题 特别声明&#xff1a; 背景 log4j这次的bug&#xff0c;我相信大家都已经知道了&#xff0c;仅以…

密探渗透工具v1.08测试版

目录 前言 免责声明 工具开发者: 工具项目地址: 1.作者做工具的缘起 2.功能介绍 3.工具的更新日志 4.安装与使用 4.1 工具下载 4.2 在jdk8环境下运行: 4.3 运行界面 4.4 资产测绘功能(fofa,鹰图和Quake) 4.5 指纹识别功能 ​编辑 4.6 敏感信息与接口扫描 4.7 文…

15W 3KVAC隔离 宽电压输入 AC/DC 电源模块——TP15AL系列

TP15AL系列产品是一款小体积裸板式电源,该系列电源输出功率为15W,具有低漏电流小于0.35mA,隔离耐压高达3KV等特点。产品安全可靠&#xff0c;EMC性能好&#xff0c;该系列产品广泛应用于智能家居、充电桩、安防、物联、工控等行业中&#xff0c;如应用于电磁兼容比较恶劣的环境…

【AI大模型应用开发】LATS:比ToT和ReAct更强大的大模型思维框架

大家好&#xff0c;我是 同学小张&#xff0c;持续学习C进阶知识和AI大模型应用实战案例&#xff0c;持续分享&#xff0c;欢迎大家点赞关注&#xff0c;共同学习和进步。 我们在大模型中常听说CoT&#xff08;思维链&#xff09;、ToT&#xff08;思维树&#xff09;&#xff…

[muduo网络库]——muduo库TimeStamp类(剖析muduo网络库核心部分、设计思想)

接着之前我们[muduo网络库]——muduo库logger类&#xff08;剖析muduo网络库核心部分、设计思想&#xff09;&#xff0c;我们接下来继续看muduo库中的TimeStamp类&#xff0c;这也是每一个类几乎都能用到的非常简单的类。 TimeStamp类 Timestamp类主要用于日志、定时器模块中…

汉诺塔问题和爬楼梯(递归)

感谢大佬的光临各位&#xff0c;希望和大家一起进步&#xff0c;望得到你的三连&#xff0c;互三支持&#xff0c;一起进步 个人主页&#xff1a;LaNzikinh-CSDN博客 c语言基础_LaNzikinh篮子的博客-CSDN博客 文章目录 一.爬楼梯问题二.汉诺塔问题总结 一.爬楼梯问题 假设你正…