开发websocket应用,最难处理的就是断线后的自动重连
现在GOFLY在线客服使用reconnect-websocket.js就可以非常简单轻松的实现断线重连
reconnect-websocket.js的机制是,当连接websocket服务的过程中,如果连不上,会自动进行指定次数的重试
如果连接成功后回调onOpen方法以后,会把重试次数清空,因此如果是连接已经成功,但是后端主动关闭连接,这个库会不断的进行连接
这个问题也一并处理了下
核心代码在下面,是cdn引入的vue以及element-ui ,GOFLY也是这样的前端架构
<html>
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
<!-- Import style -->
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/element-plus/dist/index.css"
/>
<!-- Import Vue 3 -->
<script src="https://cdn.jsdelivr.net/npm/vue@next"></script>
<!-- Import component library -->
<script src="https://cdn.jsdelivr.net/npm/element-plus"></script>
</head>
<body>
<div id="app">
<el-button>${ message }</el-button>
</div>
<script src="../../js/reconnect-websocket.js"></script>
<script>
const App = {
compilerOptions: {
delimiters: ['${', '}'],
comments: true
},
data() {
return {
message: "Hello Element Plus",
apiHost:"ws://gofly.sopans.com/ws_visitor?visitor_id=efccd385-cdfe-41ed-8dfd-ab1faa732996&to_id=taoshihan",
websocket:null,
websocketOpenNum:0,
websocketMaxOpenNum:20,
websocketClosed:true,
};
},
methods: {
//初始化websocket连接
initWebsocketConn() {
this.websocket = new ReconnectingWebSocket(this.apiHost,null,{
debug:true
});//创建Socket实例
this.websocket.onmessage = this.onMessage;
this.websocket.onopen = this.onOpen;
this.websocket.onerror = this.onError;
this.websocket.onclose = this.onClose;
},
onOpen(){
console.log("ws:onOpen");
if(this.websocketOpenNum>=this.websocketMaxOpenNum){
this.websocket.close();
}
this.websocketOpenNum++;
this.websocketClosed=false;
this.ping();
},
onMessage(){
console.log("ws:onMessage");
},
onError(){
console.log("ws:onError");
},
onClose(){
console.log("ws:onClose");
this.websocketClosed=true;
},
//心跳包
ping(){
var _this=this;
setInterval(function () {
if(!_this.websocketClosed){
_this.websocket.send("ping");
}
},10000);
},
},
//属性初始化
created(){
this.initWebsocketConn();
}
};
const app = Vue.createApp(App);
app.use(ElementPlus);
app.mount("#app");
</script>
</body>
</html>