websocket | 浅浅的封装一下

简介: 在写websocket的时候,很多页面都需要使用,每个页面重复写,太麻烦,于是先浅浅的封装一下。


在写websocket的时候,很多页面都需要使用,每个页面重复写,太麻烦,于是先浅浅的封装一下。

起一个websocket后台

  • 为了方便页面调试,我先简单的建一个nodejswebsocket后台服务,定时给发送消息。
// 引入nodejs-websocket
const ws = require("nodejs-websocket");
// 定义监听的host地址跟port端口
const host = "127.0.0.1",
  port = 8888;
// 创建ws服务
ws.createServer((conn) => {
  // 定义测试数据
  const data = ["消息1", "消息2", "消息3"];
  setInterval(() => {
    // 随机推送message里的内容
    conn.sendText(data[(Math.random() * 2).toFixed(0)]);
    console.log("推送成功!");
  }, 2000);
}).listen(port, host, () => {
  console.log(`服务打开成功:${host}:${port}`);
});

运行文件,会打印地址127.0.0.1:8888,在使用的时候就使用该地址。

使用函数封装

interface ScoketOptions {
  url: string
  token?: string[]
  message?: any
}
/**
 * 函数的形式封装
 * @param option  {url: string ,  token?: string[] ,  message?: any}
 * @returns
 */
export const useScoket = (
  option: ScoketOptions = {
    url: "",
    token: [],
    message: ""
  }
) => {
  let ws: WebSocket
  //   创建链接
  const connect = () => {
    close()
    ws = new WebSocket(option.url, option.token)
    error()
    open()
  }
  //   打开链接
  const open = () => {
    ws.onopen = () => {
      console.log("WebSocket open")
      ws.send("hello")
    }
  }
  //   接收消息
  const onMessage = (callback: (...data: any[]) => any): void => {
    if (ws) {
      ws.onmessage = (e: any) => {
        console.log("接收消息", e)
        try {
          const res = JSON.parse(e.data)
          callback(res)
        } catch (err) {
          callback(e)
        }
      }
    }
  }
  //   关闭通信
  const close = () => {
    if (ws) {
      ws.close()
      ws.onclose = (e: any) => {
        console.log(e)
      }
    }
  }
  //   发送消息
  const send = () => {
    if (ws) {
      ws.send(option.message)
    }
  }
  //   错误重连
  const error = () => {
    if (ws) {
      ws.onerror = (err) => {
        connect()
      }
    }
  }
  connect()
  return {
    onMessage,
    close,
    send
  }
}

使用class封装

interface ScoketOptions {
  url: string
  token?: string[]
  message?: any
}
/**
 * class的形式封装
 * @param option  {url: string ,  token?: string[] ,  message?: any}
 */
export class useScoket {
  private url: string = ""
  private token?: string[] = []
  private message?: string = ""
  private ws: WebSocket | null = null
  constructor(option: ScoketOptions) {
    this.url = option.url
    this.token = option.token
    this.message = option.message
    this.connect()
  }
  //   创建链接
  connect = () => {
    this.close()
    this.ws = new WebSocket(this.url, this.token)
    this.error()
    this.open()
  }
  //   打开链接
  open = () => {
    this.ws!.onopen = () => {
      console.log("WebSocket open")
      this.ws!.send("hello")
    }
  }
  //   接收消息
  onMessage = (callback: (...data: any[]) => any): void => {
    if (this.ws) {
      this.ws.onmessage = (e: any) => {
        console.log("接收消息", e)
        try {
          const res = JSON.parse(e.data)
          callback(res)
        } catch (err) {
          callback(e)
        }
      }
    }
  }
  //   关闭通信
  close = () => {
    if (this.ws) {
      this.ws.close()
      this.ws.onclose = (e: any) => {
        console.log(e)
      }
    }
  }
  //   发送消息
  send = () => {
    if (this.ws) {
      this.ws.send(this.message!)
    }
  }
  //   错误重连
  error = () => {
    if (this.ws) {
      this.ws.onerror = (err) => {
        this.connect()
      }
    }
  }
}

使用

函数方式

const ws = useScoket({ url: "ws://127.0.0.1:8888" })
ws.onMessage((data: any) => {
  console.log("message", data)
})

class方式

const ws = new useScoket({ url: "ws://127.0.0.1:8888" })
ws.onMessage((data: any) => {
  console.log("message", data)
})


相关文章
websocket封装带心跳和重连机制(vue3+ts+vite)
websocket封装带心跳和重连机制(vue3+ts+vite)
1901 0
|
3月前
|
前端开发 JavaScript API
赶快收藏!全网最佳websocket封装:完美支持断网重连、自动心跳!
【8月更文挑战第17天】赶快收藏!全网最佳websocket封装:完美支持断网重连、自动心跳!
102 3
赶快收藏!全网最佳websocket封装:完美支持断网重连、自动心跳!
|
6月前
|
网络协议 JavaScript 前端开发
将websocket封装成一个class,断线可重连
将websocket封装成一个class,断线可重连
136 3
|
6月前
|
前端开发
告别屎山!!!WebSocket 的极致封装, 写好代码竟如此简单
告别屎山!!!WebSocket 的极致封装, 写好代码竟如此简单
239 0
|
开发框架 前端开发 网络协议
服务器开发- Asp.Net Core中的websocket,并封装一个简单的中间件
服务器开发- Asp.Net Core中的websocket,并封装一个简单的中间件
492 8
|
JavaScript
vue websocket组件封装
vue websocket组件封装
251 0
|
4月前
|
前端开发 网络协议 JavaScript
在Spring Boot中实现基于WebSocket的实时通信
在Spring Boot中实现基于WebSocket的实时通信
|
28天前
|
开发框架 前端开发 网络协议
Spring Boot结合Netty和WebSocket,实现后台向前端实时推送信息
【10月更文挑战第18天】 在现代互联网应用中,实时通信变得越来越重要。WebSocket作为一种在单个TCP连接上进行全双工通信的协议,为客户端和服务器之间的实时数据传输提供了一种高效的解决方案。Netty作为一个高性能、事件驱动的NIO框架,它基于Java NIO实现了异步和事件驱动的网络应用程序。Spring Boot是一个基于Spring框架的微服务开发框架,它提供了许多开箱即用的功能和简化配置的机制。本文将详细介绍如何使用Spring Boot集成Netty和WebSocket,实现后台向前端推送信息的功能。
291 1
|
1月前
|
前端开发 Java C++
RSocket vs WebSocket:Spring Boot 3.3 中的两大实时通信利器
本文介绍了在 Spring Boot 3.3 中使用 RSocket 和 WebSocket 实现实时通信的方法。RSocket 是一种高效的网络通信协议,支持多种通信模式,适用于微服务和流式数据传输。WebSocket 则是一种标准协议,支持全双工通信,适合实时数据更新场景。文章通过一个完整的示例,展示了如何配置项目、实现前后端交互和消息传递,并提供了详细的代码示例。通过这些技术,可以大幅提升系统的响应速度和处理效率。
|
3月前
|
开发框架 网络协议 Java
SpringBoot WebSocket大揭秘:实时通信、高效协作,一文让你彻底解锁!
【8月更文挑战第25天】本文介绍如何在SpringBoot项目中集成WebSocket以实现客户端与服务端的实时通信。首先概述了WebSocket的基本原理及其优势,接着详细阐述了集成步骤:添加依赖、配置WebSocket、定义WebSocket接口及进行测试。通过示例代码展示了整个过程,旨在帮助开发者更好地理解和应用这一技术。
284 1