audiosocket服务器随机触发ConnectionResetError断开通话:原因与修复方法
ConnectionResetError [Errno 104] 在audiosocket通话中的原因与修复方案
异常原因分析
ConnectionResetError: [Errno 104] Connection reset by peer 的核心原因是对端(客户端)主动重置了TCP连接,在audiosocket通话场景下,常见触发场景包括:
- 客户端进程意外崩溃、被强制终止,或网络链路突然中断,导致TCP连接被操作系统强制重置
- 客户端侧的audiosocket实现存在bug,处理音频流时异常退出,主动断开连接
- 网络中间设备(路由器、防火墙)因TCP连接超时(长时间无数据传输或不符合安全策略)主动切断链路
- 服务器发送的音频数据格式不符合协议规范或客户端预期,导致客户端主动断开连接
修复与优化方案
1. 捕获异常并实现重连逻辑
在发送音频数据的代码块中针对性捕获该异常,触发重连流程,避免通话直接中断:
import socket # 在_process方法中修改发送逻辑 try: self.conn_sock.send(types.audio + PCM_SIZE + bytes(320)) except ConnectionResetError: # 自定义重连处理函数:关闭旧socket、重新建立连接、恢复音频流 self._close_and_reconnect()
2. 启用TCP保活机制
通过设置TCP保活参数,避免中间设备因连接超时断开链路:
# 在socket初始化完成后添加保活配置 self.conn_sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) # 设置空闲30秒后开始发送保活探测包 self.conn_sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, 30) # 保活探测包的发送间隔为10秒 self.conn_sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, 10) # 连续发送3次探测包无响应则判定连接失效 self.conn_sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPCNT, 3)
3. 校验音频数据合规性
确保发送的音频数据严格符合audiosocket协议要求:
- 确认PCM数据的采样率、位深、声道数与客户端协商一致
- 检查
PCM_SIZE的计算是否正确,音频帧长度匹配协议规定的大小 - 避免发送空或非法的音频字节流,防止客户端因解析失败断开连接
4. 客户端侧协同排查
- 查看客户端日志,确认是否存在进程崩溃、异常退出的记录
- 验证客户端使用的audiosocket库版本兼容性,尝试升级到最新稳定版
- 排查客户端网络环境是否存在不稳定、频繁丢包的情况
内容的提问来源于stack exchange,提问作者parstoo rambarzini
相关产品推荐
相关产品推荐

