定义一个wsManager类,传入ws连接地址
class wsManager{
constructor(url){
this.url=url;
this.socket=null;
}
}
定义连接函数
connect(){
this.socket=new WebSocket(this.url);
this.socket.onmessage=(message)=>{
}
this.socket.onopen=()=>{
}
this.socket.onclose=()=>{
}
this.socket.onerror=()=>{
}
}
定时发送心跳包
pingMessage:"ping"
heartbeatTime:30000
startHeartbeat(){
setInterval(()=>{
this.sendPing();
},this.heartbeatTime)
}
sendPing(){
this.socket.send(this.pingMessage);
}
连接成功时开始发送心跳包
this.socket.onopen=()=>{
this.startHearbeat();
}
超时断开连接
pingTimeout:null
pingTimeoutTime:5000
resetPingTimeout(){
clearTimeout(this.pingTimeout)
this.pingTimeout=setTimeout(()=>{
this.socket.close();
},this.pingTimeoutTime)
}
this.socket.onopen=()=>{
clearTimeout(this.pingTimeout)
}
startHeartbeat(){
setInterval(()=>{
this.sendPing();
this.resetPingTimeout();
},this.heartbeatTime)
}
断线重连
reconnectTime:5000
reconnectTimeout:null
reconnect(){
this.reconnectTimeout=setTimeout(()=>{
this.connect();
},this.reconnectTime)
}
this.socket.onclose=()=>{
this.reconnect();
}
停止发送心跳
stopHeartbeat(){
clearInterval(this.heartbeatInterval);
clearTimeout(this.pingTimeout);
clearTimeout(this.reconnectTimeout);
}
this.socket.onclose=()=>{
this.reconnect();
this.stopHeartbeat();
}
整体代码
class WebSocketManager {
constructor() {
this.url = 'ws://192.168.6.130:21110/myWs/'
this.socket = null
this.user=''
this.listeners = []
this.heartbeatInterval = null
this.reconnectTimeout = null
this.pingTimeout = null
this.pingMessage = 'ping'
this.heartbeatIntervalTime = 30000
this.pingTimeoutTime = 5000
}
connect(user) {
if(user)this.user=user
this.socket = new WebSocket(this.url+this.user)
this.socket.onopen = () => {
console.log('连接成功')
this.startHeartbeat()
}
this.socket.onmessage = (message) => {
if (message.data === this.pingMessage) {
clearTimeout(this.pingTimeout)
} else {
console.log(message)
this.notifyListeners(JSON.parse(message.data))
}
}
this.socket.onclose = () => {
console.log('连接断开')
this.stopHeartbeat()
this.reconnect()
}
this.socket.onerror = () => {
console.log('连接错误')
this.socket.close()
}
}
reconnect() {
this.reconnectTimeout = setTimeout(() => {
console.log('尝试重连 WebSocket...')
this.connect()
}, 5000)
}
close(){
this.socket.onclose=()=>{
this.stopHeartbeat()
console.log("下机断连");
}
this.socket.close();
}
startHeartbeat() {
this.heartbeatInterval = setInterval(() => {
this.sendPing()
this.resetPingTimeout()
}, this.heartbeatIntervalTime)
}
stopHeartbeat() {
clearInterval(this.heartbeatInterval)
clearTimeout(this.pingTimeout)
clearTimeout(this.reconnectTimeout)
}
sendPing() {
if (this.socket.readyState === WebSocket.OPEN) {
this.socket.send(this.pingMessage)
}
}
resetPingTimeout() {
clearTimeout(this.pingTimeout)
this.pingTimeout = setTimeout(() => {
console.log('服务器未响应,重新连接...')
this.socket.close()
}, this.pingTimeoutTime)
}
notifyListeners(message) {
this.listeners.forEach((listener) => listener(message))
}
addListener(listener) {
this.listeners.push(listener)
}
removeListener(listener) {
this.listeners = this.listeners.filter((l) => l !== listener)
}
setUrl(url){
this.url=url
}
}
export const wsManager = new WebSocketManager()