当前位置: 首页 > news >正文

云服务器建设网站教程深圳专业建站系统建站公司

云服务器建设网站教程,深圳专业建站系统建站公司,网上推广平台,惠阳网站建设公司错误报告:WebSocket 设备连接断开处理问题 项目背景 设备通过自启动的客户端连接到服务器,服务器将设备的 mac_address 和设备信息存入 Redis。前端通过 Redis 接口查看设备信息并展示。 问题描述 设备连接到服务器后,前端无法立即看到设…

错误报告:WebSocket 设备连接断开处理问题

项目背景

  1. 设备通过自启动的客户端连接到服务器,服务器将设备的 mac_address 和设备信息存入 Redis。
  2. 前端通过 Redis 接口查看设备信息并展示。

问题描述

设备连接到服务器后,前端无法立即看到设备信息。

发现的问题

  1. 设备连接后直接关机:在设备关机的情况下,服务器未及时收到断开连接的信号。由于 TCP Keep-Alive 的机制,测试中发现需要约 45 秒才会自动触发断开连接。
  2. 设备重新开机:设备重新启动后重新连接服务器。此时服务器加速了断开连接的触发(约 28 秒),但是服务器错误地删除了 Redis 中的记录。实际上,设备的连接并没有真正断开。通过向 Redis 中重新写入相同的信息,验证了 Redis 中的设备信息并未真正丢失。

目前的处理方式

为了应对上述问题,做了以下改进:

  1. 增加了校验机制:当服务器接收到断开连接时,增加了对 Redis 中存储的设备信息的检查。
  2. 心跳机制:为了更好地管理连接,预留了一个 PingPong 心跳机制,用于检测连接的有效性。由于设备端版本原因,并不全支持 pong 回应,暂时未启用这个机制,预留了一个 heartbeat ping 的函数,但它不响应 pong,后续有需要可以进一步完善。

处理方法

disconnect 方法中增加了校验机制,以确保只有在正确的条件下删除 Redis 中的设备信息。

@staticmethod
async def disconnect(ws: WebSocket, client: AsyncRedis, mac_address: str) -> None:remote_ip, remote_port = ws.clientcurrent_client_info = await client.hget(settings.REDIS_WS_CLIENT_KEY, mac_address)current_client_info = json.loads(current_client_info)if current_client_info:logger.info(f"WS_LIFESPAN: {mac_address} 正在清除状态")# 如果没有 remote port,那么说明这个链接异常,可以直接清理current_remote_port = current_client_info.get("remote_port", remote_port)# 如果旧的 ws client port 等于现在的 port,说明存储的信息仍然是当前链接的信息,可以删除if current_remote_port == remote_port:await WsService.remove_client(client, mac_address)logger.info(f"WS_LIFESPAN: {mac_address} 清除状态完成")else:logger.info(f"WS_LIFESPAN: {mac_address} 当前连接已被新连接替代,跳过清理")else:logger.info(f"WS_LIFESPAN: {mac_address} 未在 Redis 中找到客户端记录,跳过清理")

预留的 heartbeat 如下

    async def send_heartbeat():"""心跳检测- 目前只在服务器单方面检测- 如果 ping 发送失败,则认为断线,关闭连接"""while True:await asyncio.sleep(PING_INTERVAL)try:ping_msg = {"action": "ping", "timestamp": get_current_datetime_str()}await ws.send_text(json.dumps(ping_msg))logger.info(f"WS_LIFESPAN: {mac_address} 发送ping")except Exception as e:logger.error(f"WS_LIFESPAN: {mac_address} 发送ping消息失败,连接可能已断开: {str(e)}")break# 启动心跳检测任务# heartbeat_task = asyncio.create_task(send_heartbeat())

在 client 端中预留了一个 pong 机制如下 client >= 0.2.1

async def handle_ping(ws: WebSocketClientProtocol, **params):"""处理 Ping,返回 Pong"""pong_msg = {"action": "pong"}await ws.send(json.dumps(pong_msg))

解决方案

  1. TCP Keep-Alive 设置可以考虑调整 TCP Keep-Alive 设置,以加快服务器检测到设备断开的速度,从而减少等待时间。 这会影响整个设备的 TCP Keep Alive,尽量不进行
  2. 心跳机制:进一步完善 PingPong 心跳机制,确保定时检查连接是否有效。如果检测到设备失去连接,可以更快地清除 Redis 中的记录。
  3. 断开连接的逻辑加强:在断开连接的逻辑中增加更多的校验,确保只有当设备断开并且确实不再连接时才从 Redis 中移除其信息。

总结

通过对 WebSocket 断开连接的处理逻辑进行增强,增加了对 Redis 存储的校验机制,可以有效避免由于设备重新启动时,错误地删除 Redis 中的设备信息。此外,心跳机制的加入也进一步提升了连接的管理效率。

http://www.dtcms.com/a/612997.html

相关文章:

  • wordpress会员vip榆林网站seo
  • 北京网站制作公司兴田德润可信赖一个人在线观看免费社区
  • 成都网站开发制作dewplayer wordpress
  • 上海网站建设微信开发浏览览器打开网址
  • 好的文化网站模板下载电影新网站如何做seo优化
  • 织梦网站标题被改企业网站建设公
  • 如何用网站赚钱淮安做网站找哪家公司
  • 最牛的SEO教程网站农产品交易平台
  • 网站详情页怎么做郑州网站制作郑州网站制作
  • 网站建设查看框架的源代码网站建设整个流程
  • 做一下网站网站北京中航空港建设工程有限公司网站
  • 网站建设8万属于资产吗做书一般在哪个网站下载素材
  • 凤岗本地网站wordpress怎么保存xml
  • asp.net做电商网站页面深圳vi设计公司排行
  • 阿里巴巴网站开发信在哪陕西印象信息技术有限公司
  • 网站域名实名认证怎么做seo推广效果怎么样
  • 门户网站建设合同广西中小企业网站建设
  • 淘宝店做网站建设不能开直通车营销型网站建设大千建站
  • 网站推广策划思路的内容广州定制网站设计
  • 微舍 微网站 怎么做有关小城镇建设网站
  • 网站建设与优化推广方案内容中国空间站合作的17个国家
  • 做网站要考虑什么问题seo培训学院
  • 昆明制作网站的公司哪家好青岛百度推广多少钱
  • 设建网站网站留言短信提醒
  • 房地产网站模版企业管理软件管理系统牛
  • 手机网站设计案做五金奖牌进什么网站
  • 做网站搞流量网站建设验收确认书免费下载
  • 精准引流推广文案seo优化系统哪家好
  • 网站数据中心的建设湖北网站建设推荐
  • 网站建设任职软件项目实施流程八个阶段