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
相关产品推荐
相关产品推荐

