Vue websocket的封装及使用

创建 WebSocket 连接的函数

  1. 创建 WebSocket 连接:通过传入的 url 参数创建一个 WebSocket 实例。

  2. 监听连接打开事件:当连接成功建立时,执行传入的 onOpen 回调函数。

  3. 监听消息接收事件:当接收到消息时,将消息解析为 JSON
    格式,然后执行传入的 onMessage 回调函数,并将解析后的消息作为参数传递给回调函数。如果未传入 onMessage 回调函数,则禁止重新连接。

  4. 监听错误事件:当发生错误时尝试重新连接。

  5. 监听连接关闭事件:当连接关闭时,如果不需要重新连接,则关闭WebSocket 连接,否则尝试重新连接。

  6. 重新连接:在可以重新连接且未锁定重新连接状态时,延迟 5 秒后重新连接。

  7. 心跳检测:每隔 15 秒向服务器发送心跳消息以保持连接。

  8. 发送消息:如果 WebSocket 连接已经打开,则发送消息给服务器;否则打印错误信息。

  9. 关闭WebSocket 连接:设置标志位 needReconnect 为 false,然后关闭 WebSocket 连接。

封装的websocket.js文件内容如下:

export function createWebSocket(url, onOpen, onMessage) {
  if (!url) {
    return;
  }
  let canReconnect = true;
  // 避免重复连接
  let lockReconnect = false;
  let needReconnect = true;
  let ws = null;
  connect();
  heartCheck();
  return {
    ws,
    sendMessage,
    closeWs,
  };

  // 连接服务端
  function connect() {
    ws = new WebSocket(url);
    ws.onopen = function () {
      if (onOpen) {
        onOpen();
      }
    };
    ws.onmessage = function (msg) {
      if (msg && msg.data) {
        let response = JSON.parse(msg.data);
        console.log(response);
        if (onMessage) {
          onMessage(response);
        } else {
          canReconnect = false;
        }
      }
    };
    ws.onerror = function () {
      reconnect();
    };
    ws.onclose = function () {
      console.log("close");
      if (!needReconnect) {
        ws.close();
      } else {
        reconnect();
      }
    };
  }
  // 重新连接服务端
  function reconnect() {
    if (!canReconnect || lockReconnect) {
      return;
    }
    console.log("reconnect", "reconnect");
    lockReconnect = true;
    setTimeout(function () {
      connect();
      lockReconnect = false;
    }, 5000);
  }
  // 保持心跳连接
  function heartCheck() {
    if (ws && ws.readyState === 1) {
      ws.send(
        JSON.stringify({
          id: new Date().getTime(),
          method: "PING",
        })
      );
    }
    setTimeout(function () {
      heartCheck();
    }, 15000);
  }
  function sendMessage(message) {
    if (ws && ws.readyState === 1) {
      ws.send(message);
    } else {
      console.log("WebSocket is not open");
    }
  }
  function closeWs() {
    needReconnect = false;
    ws.close();
  }
}

  • ws 变量是 WebSocket 的实例,可以用于其他操作,比如手动触发事件、监听其他事件等。
  • sendMessage方法可以用于发送消息给服务器。它接受一个参数,即要发送的消息内容。
  • closeWs 方法可以用于关闭 WebSocket连接,并停止重连。调用这个方法之后,将不会再尝试重新连接服务器。(如果是自己主动关闭的话)

使用方法

<script>
import { createWebSocket } from "@/utils/websocket.js";
export default {
data(){
return{
websocket: null
}}
methods:{
handleOnOpen() {
      if (this.websocket) {
        let data = {
          你要订阅的信息
        };
        this.sendMessage(JSON.stringify(data));
      }
    },
    sendMessage(data) {
      this.websocket.sendMessage(data);
    },
    getMessage(e) {
    console.log(e, "接收到的数据");
}
},

mounted() {
this.websocket = createWebSocket(
       wss:xxxxx,//websocket链接的url
        this.handleOnOpen,
        this.getMessage
      );
}
}
</script>	

  • 20
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Vue.js是一个流行的JavaScript框架,用于构建用户界面。在Vue.js使用WebSocket,可以通过封装来简化WebSocket使用。以下是一个简单的示例,展示了如何在Vue.js封装WebSocket: 首先,安装一个WebSocket库,如`vue-native-websocket`: ```bash npm install vue-native-websocket ``` 然后,在Vue组件中创建一个WebSocket实例并封装它。假设你的组件名为`WebSocketComponent`: ```vue <template> <div> <!-- WebSocket相关操作按钮 --> <button @click="connectWebSocket">连接WebSocket</button> <button @click="disconnectWebSocket">断开WebSocket</button> <button @click="sendMessage">发送消息</button> <!-- WebSocket连接状态 --> <div v-if="connected">已连接到WebSocket服务器</div> <div v-else>未连接到WebSocket服务器</div> <!-- 接收到的消息 --> <div v-for="message in receivedMessages" :key="message.id"> {{ message.text }} </div> </div> </template> <script> import VueNativeSock from 'vue-native-websocket'; export default { data() { return { connected: false, receivedMessages: [], websocketUrl: 'ws://your-websocket-url', // WebSocket服务器地址 websocketOptions: { format: 'json', // 可选:数据格式,默认是字符串格式 }, }; }, methods: { connectWebSocket() { this.$connect(); // 连接到WebSocket服务器 }, disconnectWebSocket() { this.$disconnect(); // 断开WebSocket连接 }, sendMessage() { const message = { text: 'Hello WebSocket!', }; this.$socket.send(JSON.stringify(message)); // 发送消息 }, }, mounted() { Vue.use(VueNativeSock, this.websocketUrl, this.websocketOptions); // 监听WebSocket连接事件 this.$options.sockets.onopen = () => { this.connected = true; }; // 监听WebSocket关闭事件 this.$options.sockets.onclose = () => { this.connected = false; }; // 监听WebSocket收到消息事件 this.$options.sockets.onmessage = (event) => { const message = JSON.parse(event.data); this.receivedMessages.push(message); }; }, }; </script> ``` 这个示例将WebSocket连接、断开连接和发送消息的操作封装在`WebSocketComponent`组件中。它还展示了如何使用`vue-native-websocket`插件来实现WebSocket的功能。你可以根据自己的需求来修改和扩展这个示例。 注意:在实际使用中,你需要将`ws://your-websocket-url`替换为你的WebSocket服务器的地址。另外,你可能还需要在Vue.js的配置文件(例如`main.js`)中导入和使用WebSocket库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值