You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Socket服务端运行一段时间后卡顿问题排查求助

服务端代码问题分析及卡顿原因

一、服务端代码存在的核心问题

1. 阻塞式recv无超时设置

当前代码中的conn.recv(1024)是阻塞调用,如果客户端因网络波动、自身处理延迟等原因未及时发送响应,服务端会一直卡在该调用处,表现为“卡顿”。代码未设置socket超时时间,一旦出现异常情况,程序会无限等待。

2. 未处理TCP粘包/拆包问题

TCP是流式传输协议,recv(1024)无法保证每次读取到完整的一条消息:

  • 可能一次读取到多条客户端消息(粘包),导致后续解析逻辑混乱
  • 可能只读取到半条消息(拆包),使得data不符合预期格式,进而破坏交互时序

从你提供的数据包来看,所有消息均以\r\n(CRLF)结尾,服务端应该基于这个分隔符按行读取完整消息,而非直接读取固定长度数据。

3. 交互时序依赖过强,容错性差

代码的循环逻辑是严格的线性依赖:

发送按钮创建指令 → 等待"40=40"回复 → 发送"40"指令 → 等待按钮按压回复

一旦某一步的消息丢失、延迟或顺序错乱,服务端就会卡在recv处,无法继续执行后续逻辑,直接表现为卡顿。

4. 缺乏异常处理机制

代码未捕获socket通信中的异常(如连接中断、网络错误等),一旦出现异常,程序会直接崩溃或陷入无响应状态,无法优雅处理错误并恢复。

二、卡顿的主要原因:时序与传输问题叠加

运行初期交互正常,但几分钟后卡顿,大概率是以下情况导致:

  1. 长时间运行后出现TCP粘包/拆包,服务端读取到不完整或错误的消息,导致后续recv等待的内容与客户端发送的不匹配,程序卡住
  2. 客户端因资源占用过高(JS应用在Android上的性能限制)导致消息发送延迟,服务端因无超时设置一直阻塞等待
  3. 未处理的异常积累,导致socket连接状态异常,最终引发卡顿

三、修复建议

  • 给socket设置超时时间:使用conn.settimeout(10)(根据实际需求调整时长),超时后捕获异常并处理
  • 实现按行读取消息:基于CRLF分隔符,循环读取直到获取完整的一条消息,避免粘包/拆包问题
  • 增加消息校验与容错逻辑:在每次解析消息前校验格式,若收到不符合预期的消息,可主动重置交互流程或重新发送指令
  • 添加异常捕获:用try-except块包裹socket操作,捕获socket.timeout、ConnectionResetError等异常,处理连接中断或错误情况

内容的提问来源于stack exchange,提问作者user1530405

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 08:50:37