大家在做加密货币行情看板、量化交易机器人、实时价格监控时,几乎都会遇到一个超头疼的问题:WebSocket 连接动不动就超时、断开、重连失败,尤其是网络波动、服务器空闲、心跳异常时,行情直接中断,程序直接 “卡死”。
这篇慕课手记就用最简单、最实战、最适合练手与项目上线的方式,带你一步步定位原因、写出稳定重连机制,让你的加密货币实时数据7×24 小时不断线。
一、先搞懂:为什么 WebSocket 会断?
在加密货币实时 API 场景里,断开基本就这 4 个原因:
长时间没消息,网关 / 防火墙直接切断空闲连接
缺少心跳包,服务端认为客户端已下线主动关闭
网络闪断、代理波动,客户端没做自动重连
并发订阅太多,服务端限流或触发保护机制
不是你的代码烂,而是长连接本身就需要保活机制。
二、最容易踩的 3 个坑(新手必看)
只写连接逻辑,完全不处理断开
收到 close/error 事件不重连,断了就彻底凉
重连不加退避策略,一断就疯狂重连炸服务
只要补上一套心跳 + 监听 + 智能重连,问题基本全解决。
三、实战核心:稳定不断的 WebSocket 模板(直接复制)
下面这套结构是我项目里一直在用的生产级极简模板,你只要替换地址和订阅内容就能跑。
import json
import time
import websocket
from threading import Timer
# 全局配置
WS_URL = "wss://你的加密货币API地址"
RECONNECT_INTERVAL = 3 # 重连间隔秒
HEARTBEAT_INTERVAL = 10 # 心跳间隔
def on_message(ws, message):
# 处理实时行情
tick = json.loads(message)
print(tick)
def on_error(ws, error):
print("错误:", error)
def on_close(ws, close_code, reason):
print("断开,准备重连...")
# 断开后自动重连
time.sleep(RECONNECT_INTERVAL)
start_websocket()
def on_open(ws):
print("连接成功")
# 订阅行情
ws.send(json.dumps({
"action": "subscribe",
"symbols": ["btcusdt", "ethusdt"]
}))
# 启动心跳
start_heartbeat(ws)
# 心跳保活
def start_heartbeat(ws):
def heartbeat():
while True:
time.sleep(HEARTBEAT_INTERVAL)
if ws.sock and ws.sock.connected:
ws.send(json.dumps({"action": "ping"}))
Timer(0, heartbeat).start()
# 启动入口
def start_websocket():
ws = websocket.WebSocketApp(WS_URL)
ws.on_message = on_message
ws.on_error = on_error
ws.on_close = on_close
ws.on_open = on_open
ws.run_forever()
if __name__ == "__main__":
start_websocket()四、让连接更稳的 4 个小技巧(实战总结)
必须加心跳:ping/pong 是长连接生命线
断开必重连:on_close 里统一触发重连逻辑
重连加间隔:不要死循环瞬间爆请求
订阅不要贪多:分批订阅,避免被限流
做到这 4 点,你的 WebSocket 基本很难再断。
五、总结
加密货币实时 API 的 WebSocket 超时断开,是长连接的正常现象,不是 BUG。只要用一套心跳保活 + 自动重连 + 错误监听的标准结构,就能轻松解决。
在实际项目中,AllTick API 提供稳定、低延迟的加密货币实时行情,配合上面这套重连机制,不管是课程作业、个人练手还是小项目上线,都能稳稳运行、不断线。
随时随地看视频