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)
2125 0
|
前端开发 JavaScript API
赶快收藏!全网最佳websocket封装:完美支持断网重连、自动心跳!
【8月更文挑战第17天】赶快收藏!全网最佳websocket封装:完美支持断网重连、自动心跳!
752 3
赶快收藏!全网最佳websocket封装:完美支持断网重连、自动心跳!
|
网络协议 JavaScript 前端开发
将websocket封装成一个class,断线可重连
将websocket封装成一个class,断线可重连
567 3
|
开发框架 前端开发 网络协议
服务器开发- Asp.Net Core中的websocket,并封装一个简单的中间件
服务器开发- Asp.Net Core中的websocket,并封装一个简单的中间件
1177 111
|
前端开发
告别屎山!!!WebSocket 的极致封装, 写好代码竟如此简单
告别屎山!!!WebSocket 的极致封装, 写好代码竟如此简单
466 0
|
JavaScript
vue websocket组件封装
vue websocket组件封装
402 0
|
前端开发 网络协议 JavaScript
在Spring Boot中实现基于WebSocket的实时通信
在Spring Boot中实现基于WebSocket的实时通信
|
开发框架 前端开发 网络协议
Spring Boot结合Netty和WebSocket,实现后台向前端实时推送信息
【10月更文挑战第18天】 在现代互联网应用中,实时通信变得越来越重要。WebSocket作为一种在单个TCP连接上进行全双工通信的协议,为客户端和服务器之间的实时数据传输提供了一种高效的解决方案。Netty作为一个高性能、事件驱动的NIO框架,它基于Java NIO实现了异步和事件驱动的网络应用程序。Spring Boot是一个基于Spring框架的微服务开发框架,它提供了许多开箱即用的功能和简化配置的机制。本文将详细介绍如何使用Spring Boot集成Netty和WebSocket,实现后台向前端推送信息的功能。
3220 1
|
7月前
|
Java
SpringBoot快速搭建WebSocket服务端和客户端
由于工作需要,研究了SpringBoot搭建WebSocket双向通信的过程,其他的教程看了许多,感觉讲得太复杂,很容易弄乱,这里我只展示快速搭建过程。
2182 1
|
10月前
|
消息中间件 XML 前端开发
springBoot集成websocket实时消息推送
本文介绍了如何在Spring Boot项目中集成WebSocket实现实时消息推送。首先,通过引入`spring-boot-starter-websocket`依赖,配置`WebSocketConfig`类来启用WebSocket支持。接着,创建`WebSocketTest`服务器类,处理连接、消息收发及错误等事件,并使用`ConcurrentHashMap`管理用户连接。最后,前端通过JavaScript建立WebSocket连接,监听消息并进行相应处理。此方案适用于需要实时通信的应用场景,如聊天室、通知系统等。
1563 2