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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 06:35:46