1、定期发送心跳包(ping/pong)
客户端和服务器端都需要定期发送ping消息,并相应得到pong消息,以确保连接仍然正常。如果超过一定时间没收到pong,需要主动关闭连接。
JS客户端代码:
//定期发送ping
setInterval(() => {
websocket.send('ping');
}, 30000);
Python客户端代码:
#定时发送ping
def heartbeat() :
while True:
ws.send("ping")
time.sleep(30) #30s一次
#开启定时任务
threading.Thread(target=heartbeat).start()
java服务器端代码
@ServerEndpoint("/websocket")
public class WebSocketServer {
private Session session;
@OnMessage
public void onMessage(String message, Session session) {
this.session = session;
if (message.equals("ping")) {
try {
session.getBasicRemote().sendPong(null); // 回复pong
} catch (IOException e) {
e.printStackTrace();
}
} else {
// 处理其他消息
}
}
}
2、捕获关闭连接事件并重连websocket
JS客户端代码:
//连接关闭的回调方法
websocket.onclose = function() {
setMessageInnerHTML("WebSocket连接关闭");
setTimeout(() => {
webSocket = new WebSocket('ws://url'); // 重新连接
}, 5000); // 5秒后重连
}
Python客户端代码:
def on_close(ws):
timer = threading.Timer(5, connect)
timer.start()
ws.on_close = on_close
def connect():
ws.connect("ws://url")
3、实现断线重连
JS客户端:文章来源:https://www.toymoban.com/news/detail-601776.html
setInterval(() => {
if (!navigator.onLine) { // 网络断开
setTimeout(() => {
webSocket = new WebSocket('ws://url'); // 网络恢复,重连
}, 5000);
}
}, 1000);
Python客户端:文章来源地址https://www.toymoban.com/news/detail-601776.html
def get_network_info():
return networkx.is_connected()
def reconnect():
timer = threading.Timer(5, connect)
timer.start()
def check_network():
while True:
if not get_network_info():
reconnect()
time.sleep(10)
threading.Thread(target=check_network).start()
到了这里,关于保持websocket长时间连接永不断开的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!