webSocket前端+webSocket封装

本文介绍了WebSocket的基础知识,包括创建WebSocket对象、连接成功后的回调函数、接收信息的处理以及窗口关闭时的处理。接着展示了如何封装WebSocket类,提供了更方便的事件处理方法。最后提到了一个用于测试WebSocket接通的工具,帮助前端开发者在没有后端接口的情况下进行调试。

一、websocket基础
二、websocket 封装
三、websocket 测试接通

一、websocket 基础

// WebSocket构造函数,创建WebSocket对象
let ws = new WebSocket('ws://localhost:8888')
// 连接成功后的回调函数
ws.onopen = function (params) {
  console.log('客户端连接成功')
  // 向服务器发送消息
  ws.send('hello')
};
// 从服务器接受到信息时的回调函数
ws.onmessage = function (e) {
  console.log('收到服务器响应', e.data)
};
// 连接关闭后的回调函数
ws.onclose = function(evt) {
  console.log("关闭客户端连接");
};

// 连接失败后的回调函数
ws.onerror = function (evt) {
  console.log("连接失败了");
};


// 监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,这样服务端会抛异常。
window.onbeforeunload = function() {
    ws.close();
}

二、websocket 封装

class MyWebScoket {
  constructor(socketUrl) {
    // super(socketUrl);
    this.onopenFn = null
    this.oncloseFn = null
    this.onmessageFn = null
    this.onerrorFn = null
    this.socketUrl = socketUrl
    this.socket = null
    this.init()
  }

  init() {
    let self = this
    let timeStep = new Date().getTime();
    self.socket = new WebSocket(self.socketUrl + timeStep);
    self.socket.onopen = function (event) {
      if (self.onopenFn) {
        self.onopenFn(event)
      }
    }
    self.socket.onmessageFn = function (event) {
      console.log(event, '连接关闭')
      if (self.onmessageFn) {
        self.onmessageFn(event)
      }
    }
    self.socket.onerrorFn = function (event) {
      console.log(event, 'websocket通信发生错误')
      if (self.onerrorFn) {
        self.onerrorFn(event)
      }
    }
    self.socket.oncloseFn = function (event) {
      console.log(event, '处理业务')
      if (self.oncloseFn) {
        self.oncloseFn(event)
      }
    }
  }
  close() {
    this.socket.close()
  }
}

export default MyWebScoket

2.使用(vue)

  import websocket from "./websocket.js"

  setWebsocket(){
      this.socket = new MyWebScoket(socketUrl)//socketUrl请求的地址
      this.socket.onopenFn = this.onopen.bind(this)
      this.socket.oncloseFn = this.onclose .bind(this)
      this.socket.onmessageFn = this.onmessage .bind(this)
      this.socket.onerrorFn = this.onerror.bind(this)
    },
    onopen(event){
      //业务处理
    },
    onclose(event){
      //业务处理
    },
    onmessage(event){
      //业务处理
    },
    onerror(event){
      //业务处理
    },

三、websocket 测试接通

下载包:https://download.youkuaiyun.com/download/Web_Notes/88695650?spm=1001.2014.3001.5501

项目介绍:可以用来测试websocket接通后的效果,方便前端调整,就不用等后端接口了。
index.js为主要文件,运行命令为 node index.js

使用方法:
1.index.js 页面
在这里插入图片描述
2.index.html
在这里插入图片描述

3.浏览器打开index.html,打开控制台,如果能收到index.js发送的内容,就没问题了。
就把index.html里面websocket 请求的地址 复制到你其他需要使用的项目里,就可以接收websocket 进行调整处理了

### WebSocket 前端封装代码示例 以下是基于引用中的内容以及常见实践的一种 WebSocket 封装实现方式。此封装旨在提供一个稳定、可靠的 WebSocket 接口,支持自动重连、消息发送与接收、心跳检测等功能。 #### 封装代码示例 ```javascript // websocketService.js class WebSocketService { constructor(url, options = {}) { this.url = url; this.options = options || {}; this.socket = null; this.isReconnecting = false; this.reconnectAttempts = 0; this.maxReconnectAttempts = this.options.maxReconnectAttempts || 5; this.reconnectInterval = this.options.reconnectInterval || 3000; this.connect(); } connect() { try { this.socket = new WebSocket(this.url); this.setupEventListeners(); } catch (e) { console.error(`Failed to establish WebSocket connection: ${e.message}`); } } setupEventListeners() { this.socket.onopen = () => { console.log('WebSocket connection established'); this.resetReconnectionState(); }; this.socket.onmessage = (event) => { const data = JSON.parse(event.data); if (this.options.onMessage) { this.options.onMessage(data); } }; this.socket.onclose = (event) => { console.warn(`WebSocket closed with code: ${event.code}, reason: ${event.reason}`); if (!this.isReconnecting && event.wasClean === false) { this.attemptReconnect(); } }; this.socket.onerror = (error) => { console.error(`WebSocket error occurred: ${error.message}`); }; } attemptReconnect() { if (this.reconnectAttempts >= this.maxReconnectAttempts) { console.error('Max reconnection attempts reached. Stopping further retries.'); return; } this.isReconnecting = true; setTimeout(() => { this.reconnectAttempts++; console.info(`Attempting reconnect (${this.reconnectAttempts}/${this.maxReconnectAttempts})`); this.connect(); }, this.reconnectInterval); } resetReconnectionState() { this.isReconnecting = false; this.reconnectAttempts = 0; } send(message) { if (this.socket.readyState === WebSocket.OPEN) { this.socket.send(JSON.stringify(message)); } else { console.warn('WebSocket is not open. Message cannot be sent.'); } } close(code = 1000, reason = 'Normal closure') { this.socket.close(code, reason); } startHeartbeat(interval = 30000) { clearInterval(this.heartbeatTimer); this.heartbeatTimer = setInterval(() => { if (this.socket.readyState !== WebSocket.OPEN) { console.warn('WebSocket heartbeat failed due to disconnected state.'); this.attemptReconnect(); } else { this.send({ type: 'heartbeat' }); } }, interval); } stopHeartbeat() { clearInterval(this.heartbeatTimer); } } export default WebSocketService; ``` --- ### 功能解析 1. **连接管理**: 使用 `new WebSocket()` 创建 WebSocket 实例并设置事件监听器[^2]。 2. **自动重连机制**: 当 WebSocket 非正常关闭时 (`wasClean === false`),尝试重新连接。通过 `setTimeout` 控制重连间隔时间,并限制最大重连次数以防止无限循环[^2]。 3. **心跳检测**: 定期向服务器发送心跳包以保持连接活跃状态。如果发现连接中断,则立即触发重连逻辑。 4. **消息收发**: 支持将数据序列化为 JSON 并通过 `socket.send()` 发送;同时能够解码接收到的数据并调用自定义回调函数处理业务逻辑[^2]。 5. **错误日志记录**: 对于任何异常情况(如无法建立初始连接或运行期间发生的错误),均会打印详细的错误信息以便调试。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值