前端Websocket的使用

本文深入解析WebSocket协议,探讨其在客户端与服务器间实现实时双向通信的优势与应用场景,如聊天室等。文章涵盖WebSocket的基本概念、使用场景、API介绍及实战代码示例,助您快速掌握WebSocket的运用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前段时间因工作业务需要,简单了解了一下Websocket的概念和前端的使用。总结如下:

概念:

Websocket是一种协议,通过客户端和服务器之间的长久的TCP通信,使客户端和服务器之间可以随时交换数据。

使用场景:

由于http协议只能由客户端发起通信,如果服务器有连续的状态变化,客户端要获知就非常麻烦。我们只能使用"轮询":每隔一段时候,就发出一个询问,了解服务器有没有新的信息。最典型的场景就是聊天室。Websocket在解决这样的需求上非常方便。

说明:

  • 建立在 TCP 协议之上
  • 与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器
  • 数据格式比较轻量,性能开销小,通信高效
  • 可以发送文本,也可以发送二进制数据
  • 没有同源限制,客户端可以与任意服务器通信
  • 协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。

API介绍:

  • WebSocket构造函数: 新建WebSocket实例后,会创建客户端与服务端的WebSocket连接
    let ws = new WebSocket(url)
  • WebSocket实例的当前状态:
    ws.readyState // 0: 'CONNECTING',表示正在连接
                  // 1: 'OPEN', 表示连接成功,可以通信了
                  // 2: 'CLOSING', 表示连接正在关闭
                  // 3: 'CLOSED', 表示连接已经关闭,或者打开连接失败。
  • WebSocket实例的事件:
    ws.onopen = function () {} // 指定连接成功后的回调函数
    ws.onclose = function () {} // 指定连接关闭后的回调函数
    ws.onmessage = function () {} // 指定收到服务器数据后的回调函数
    ws.onerror = function () {} // 指定报错时的回调函数
  • WebSocket实例向后台推送消息的方法:
    ws.send(message)

WebSocket应用实例

/* WebSocket封装
 * @param url: WebSocket接口地址与携带参数必填
 * @param onOpenFunc: WebSocket的onopen回调函数,如果不需要可传null
 * @param onMessageFunc: WebSocket的onmessage回调函数,如果不需要可传null
 * @param onCloseFunc: WebSocket的onclose回调函数,如果不需要可传null
 * @param onErrorFunc: WebSocket的onerror回调函数,如果不需要可传null
 * @param heartMessage: 发送后台的心跳包参数,必填 (给服务端的心跳包就是定期给服务端发送消息)
 * @param timer: 给后台传送心跳包的间隔时间,不传时使用默认值3000毫秒
 * @param isReconnect: 是否断掉立即重连,不传true时不重连
*/
function useWebSocket (url, onOpenFunc, onMessageFunc, onCloseFunc, onErrorFunc, heartMessage, timer, isReconnect) {
  let isConnected = false // 设定已链接webSocket标记
  // websocket对象
  let ws = null
  // 创建并链接webSocket
  let connect = () => {
    // 如果未链接webSocket,则创建一个新的webSocket
    if (!isConnected) {
      ws = new WebSocket(url)
      isConnected = true
    }
  }
  // 向后台发送心跳消息
  let heartCheck = () => {
    ws.send(JSON.stringify(heartMessage))
  }
  // 初始化事件回调函数
  let initEventHandle = () => {
    ws.addEventListener('open', (e) => {
      console.log('onopen', e)
      // 给后台发心跳请求,在onmessage中取得消息则说明链接正常
      heartCheck()
      // 如果传入了函数,执行onOpenFunc
      if (!onOpenFunc) {
        return false
      } else {
        onOpenFunc(e)
      }
    })
    ws.addEventListener('message', (e) => {
      console.log('onmessage', e)
      // 接收到任何后台消息都说明当前连接是正常的
      if (!e) {
        console.log('get nothing from service')
        return false
      } else {
        // 如果获取到后台消息,则timer毫秒后再次发起心跳请求给后台,检测是否断连
        setTimeout(() => {
          heartCheck()
        }, !timer ? 3000 : timer)
      }
      // 如果传入了函数,执行onMessageFunc
      if (!onMessageFunc) {
        return false
      } else {
        onMessageFunc(e)
      }
    })
    ws.addEventListener('close', (e) => {
      console.log('onclose', e)
      // 如果传入了函数,执行onCloseFunc
      if (!onCloseFunc) {
        return false
      } else {
        onCloseFunc(e)
      }
      if (isReconnect) { // 如果断开立即重连标志为true
        // 重新链接webSocket
        connect()
      }
    })
    ws.addEventListener('error', (e) => {
      console.log('onerror', e)
      // 如果传入了函数,执行onErrorFunc
      if (!onErrorFunc) {
        return false
      } else {
        onErrorFunc(e)
      }
      if (isReconnect) { // 如果断开立即重连标志为true
        // 重新链接webSocket
        connect()
      }
    })
  }
  // 初始化webSocket
  (() => {
    // 1.创建并链接webSocket
    connect()
    // 2.初始化事件回调函数
    initEventHandle()
    // 3.返回是否已连接
    return ws
  })()
}

// WebSocket函数使用实例
useWebSocket( url, // url
              null, // onopen回调
              (e) => { // onmessage回调
                let res = JSON.parse(e.data) // 后端返回的数据
                console.log(res)
              },
              null, // onclose回调
              null, // onerror回调
              { // 心跳包消息
                "action": "9999",
                "eventType": "100",
                "requestId": ""
              },
              null, // 传送心跳包的间隔时间
              true // 断掉立即重连
)   
参考地址: http://www.ruanyifeng.com/blo...
### 前端 WebSocket 使用场景及案例 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,它允许客户端和服务端之间实时传输数据。以下是 WebSocket前端开发中的主要应用场景及其实际应用案例: #### 实时聊天应用 WebSocket 提供了一种高效的解决方案来实现实时消息传递功能。通过建立持久化连接,用户之间的消息可以即时送达而无需轮询服务器[^1]。 ```javascript // 创建 WebSocket 对象并监听事件 const socket = new WebSocket('ws://example.com/socket'); socket.onopen = function() { console.log("Connection opened"); }; socket.onmessage = function(event) { const message = event.data; console.log(`Message received: ${message}`); }; ``` #### 游戏互动平台 对于在线多人游戏来说,低延迟的数据交换至关重要。WebSocket 能够显著减少网络开销和响应时间,从而提升用户体验[^2]。 #### 社交媒体动态更新 当涉及到社交媒体上的点赞数变化或者评论新增等功能时,利用 WebSocket 技术可以让这些信息自动刷新显示给用户看,而不是依赖传统的页面重载方式[^3]。 #### 数据可视化仪表盘 企业常用的各种监控系统或分析工具往往需要展示不断变动的关键指标图表;借助于 WebSocket 可以持续推送最新统计数据至前端界面以便及时反映实际情况。 #### 文件上传进度跟踪 虽然 HTML5 已经支持分片文件传送机制,但如果想更精确地掌握整个过程状态,则可以通过 WebSocket 来报告当前已完成百分比等情况反馈给使用者知道。 ```html <button id="connectBtn">Connect to WS Server</button> <script type="text/javascript"> document.getElementById('connectBtn').onclick = () => { let wsUri = 'ws://localhost:8080'; websocket = new WebSocket(wsUri); websocket.onerror = function(evt){ onError(evt); }; } function onError(evt){ writeToScreen('<span style="color: red;">ERROR:</span> '+ evt.data); } function writeToScreen(message){ var pre=document.createElement("p"); pre.style.wordWrap="break-word"; pre.innerHTML=message; output.appendChild(pre); } </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值