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

Python Websockets报1011 Ping超时错误(无关闭帧接收)求助

解决WebSocket Ping超时错误:sent 1011 (unexpected error) keepalive ping timeout

问题分析

你遇到的1011错误是因为WebSocket客户端未在指定时间内收到服务器的Pong响应,触发超时断开。你的代码存在两个关键问题:

  • 同时启用了库的自动Ping机制(ping_interval参数)和手动Ping调用,两者的时序逻辑会产生冲突
  • 手动Ping的同步等待方式可能阻塞自动Ping的执行流程

修复方案

1. 移除手动Ping调用,依赖自动Ping机制

websockets库的ping_interval参数会自动按指定间隔发送Ping帧,并自动处理Pong响应,无需手动调用ping()方法。手动调用反而会干扰自动逻辑,导致Ping/Pong时序混乱。

2. 调整Ping参数匹配需求

你原本想每20秒发送一次Ping,直接将ping_interval设为20,并合理设置ping_timeout(等待Pong的超时时间,建议比ping_interval稍长,避免服务器延迟导致误判)。

3. 确保连接持续活跃

连接建立后,需要保持协程处于运行状态(比如通过循环监听消息或维持事件循环),否则连接会因协程结束而被主动关闭。

修改后的代码示例

import asyncio
import websockets
import logging

async def connect_websocket():
    self.header = {}  # 替换为你的实际请求头
    self.ROOT_URI = "ws://your-server-url"  # 替换为你的服务器地址
    
    # 配置自动Ping参数:每20秒发一次Ping,等待Pong超时30秒
    self.ws = await websockets.connect(
        self.ROOT_URI,
        extra_headers=self.header,
        logger=logging.getLogger("websockets.client"),
        ping_interval=20,
        ping_timeout=30
    )
    
    # 保持连接活跃:这里以监听消息为例,可根据业务逻辑调整
    try:
        async for message in self.ws:
            print(f"收到消息: {message}")
    except websockets.exceptions.ConnectionClosed:
        print("连接已关闭")

asyncio.run(connect_websocket())

额外排查点

  • 检查服务器端是否正确处理Ping帧:确保服务器会回复Pong,且没有防火墙/代理拦截Ping/Pong帧
  • 查看客户端日志:通过logger输出详细的WebSocket交互日志,确认Ping是否正常发送、Pong是否收到

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 10:50:41