1、定期發(fā)送心跳包(ping/pong)
客戶端和服務(wù)器端都需要定期發(fā)送ping消息,并相應(yīng)得到pong消息,以確保連接仍然正常。如果超過一定時間沒收到pong,需要主動關(guān)閉連接。
JS客戶端代碼:
//定期發(fā)送ping
setInterval(() => {
websocket.send('ping');
}, 30000);
Python客戶端代碼:
#定時發(fā)送ping
def heartbeat() :
while True:
ws.send("ping")
time.sleep(30) #30s一次
#開啟定時任務(wù)
threading.Thread(target=heartbeat).start()
java服務(wù)器端代碼
@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); // 回復(fù)pong
} catch (IOException e) {
e.printStackTrace();
}
} else {
// 處理其他消息
}
}
}
2、捕獲關(guān)閉連接事件并重連websocket
JS客戶端代碼:
//連接關(guān)閉的回調(diào)方法
websocket.onclose = function() {
setMessageInnerHTML("WebSocket連接關(guān)閉");
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、實現(xiàn)斷線重連
JS客戶端:文章來源:http://www.zghlxwxcb.cn/news/detail-601776.html
setInterval(() => {
if (!navigator.onLine) { // 網(wǎng)絡(luò)斷開
setTimeout(() => {
webSocket = new WebSocket('ws://url'); // 網(wǎng)絡(luò)恢復(fù),重連
}, 5000);
}
}, 1000);
Python客戶端:文章來源地址http://www.zghlxwxcb.cn/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()
到了這里,關(guān)于保持websocket長時間連接永不斷開的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!