前端WebSocket封装使用

例子: 

1. utils里新建websocket.js

import Vue from 'vue'
import { Message } from 'element-ui'
let v = new Vue()
v.$message = Message;
var webSocket = null;
var isConnect = false; //连接状态
var globalCallback = function(e){ console.log(e) };//定义外部接收数据的回调函数
var reConnectNum = 0;//重连次数


//心跳设置
var heartCheck = {
    heart:"heart",//心跳包
    timeout: 60 * 1000, //每段时间发送一次心跳包 这里设置为60s
    heartbeat: null, //延时发送消息对象(启动心跳新建这个对象,收到消息后重置对象)
    start: function () {
        this.heartbeat = setInterval(()=>{
            if (isConnect){
                webSocketSend(this.heart);
            }else{
                this.clear();
            }
        }, this.timeout);
    },
    reset: function () {
        clearInterval(this.heartbeat);
        this.start();
    },
    clear:function(){
        clearInterval(this.heartbeat);
    }
}

//初始化websocket
function initWebSocket(callback) {
    let useInfo = localStorage.getItem("userInfo");
    let websocketUrl = null
    if (useInfo != null) {
        let userId = JSON.parse(useInfo).content.user_id;
        websocketUrl = `ws://172.25.5.132:9000/websocket/${userId}`; //本地
        //   websocketUrl = `ws://${location.hostname}:${location.port}/websocket/${userId}`; // 线上
    }

    //此callback为在其他地方调用时定义的接收socket数据的函数
    if(callback){
        if(typeof callback == 'function'){
            globalCallback = callback
        }else{
            throw new Error("callback is not a function")
        }
    }
    if ("WebSocket" in window) {
        webSocket = new WebSocket(websocketUrl);//创建socket对象
    } else {
        Message({
            message: '该浏览器不支持websocket!',
            type: 'warning'
        });
        return
    }
    //打开
    webSocket.onopen = function() {
        webSocketOpen();
    };
    //收信
    webSocket.onmessage = function(e) {
        webSocketOnMessage(e);
    };
    //关闭
    webSocket.onclose = function(e) {
        webSocketOnClose(e);
    };
    //连接发生错误的回调方法
    webSocket.onerror = function(e) {
        webSocketonError(e);
    };
}
//连接socket建立时触发
function webSocketOpen() {
    console.log("WebSocket连接成功");
    //首次握手
    webSocketSend(heartCheck.heart);
    isConnect = true;
    heartCheck.start();
    reConnectNum = 0;
}

//客户端接收服务端数据时触发,e为接受的数据对象
function webSocketOnMessage(e) {
    console.log("websocket信息:");
    console.log(e.data)
    if(e.data == "stopUser") {
        Message({
            message: '你已被上级管理员停用即将跳转登录页',
            type: 'warning'
        });
        setTimeout(() => {
            window.location.href = `${window.location.origin}/${window.location.hash}`
        }, 3000);
    }
    const data = JSON.parse(e.data);//根据自己的需要对接收到的数据进行格式化
    globalCallback(data);//将data传给在外定义的接收数据的函数,至关重要。
}

//socket关闭时触发
function webSocketOnClose(e){
    heartCheck.clear();
    isConnect = false; //断开后修改标识
    console.log(e)
    console.log('webSocket已经关闭 (code:' + e.code + ')')
    //被动断开,重新连接
    if(e.code == 1006){
        if(reConnectNum < 3){
            initWebSocket();
            ++reConnectNum;
        }else{
            v.$message({
                message: 'websocket连接不上,请刷新页面或联系开发人员!',
                type: 'warning'
            });
        }
    }
}

//连接发生错误的回调方法
function webSocketonError(e){
    heartCheck.clear();
    isConnect = false; //断开后修改标识
    console.log("WebSocket连接发生错误:");
    console.log(e);
}


//发送数据
function webSocketSend(data) {
    webSocket.send(JSON.stringify(data));//在这里根据自己的需要转换数据格式
}
//在其他需要socket地方主动关闭socket
function closeWebSocket(e) {
    webSocket.close();
    heartCheck.clear();
    isConnect = false;
    reConnectNum = 0;
}
//在其他需要socket地方接受数据
function getSock(callback) {
    globalCallback = callback
}
//在其他需要socket地方调用的函数,用来发送数据及接受数据
function sendSock(agentData) {
    //下面的判断主要是考虑到socket连接可能中断或者其他的因素,可以重新发送此条消息。
    switch (webSocket.readyState) {
        //CONNECTING:值为0,表示正在连接。
        case webSocket.CONNECTING:
            setTimeout(function() {
                sendSock(agentData, callback);
            }, 1000);
        break;
        //OPEN:值为1,表示连接成功,可以通信了。
        case webSocket.OPEN:
            webSocketSend(agentData);
        break;
        //CLOSING:值为2,表示连接正在关闭。
        case webSocket.CLOSING:
            setTimeout(function() {
                sendSock(agentData, callback);
            }, 1000);
        break;
        //CLOSED:值为3,表示连接已经关闭,或者打开连接失败。
        case webSocket.CLOSED:
        // do something
        break;
        default:
        // this never happens
        break;
    }
}

export default {
  initWebSocket,
  closeWebSocket,
  sendSock,
  getSock
};

2. main.js引入挂载原型

import Vue from "vue";
import App from "./App.vue";
import router from "./router";
import store from "./store";
import axios from "./utils/api/index";
import utils from "./utils";
import socketApi from "./utils/websocket";
Vue.prototype.$socketApi = socketApi;//websocket挂在原型上

3. 页面里使用

beforeDestroy() {//销毁的生命周期
       this.$socketApi.closeWebSocket();
  },
  mounted() {//挂载的生命周期
    this.$socketApi.initWebSocket(this.getsocketResult);
  },
 methods: {
    // socket信息返回接受函数
       getsocketResult(data) {
         console.log(data);
       },
       //发送socket信息
       websocketSend(data) {
         this.$socketApi.sendSock(data);
       },
 },

### 回答1: 前端可以使用 WebSocket API 来实现 WebSocket 通信。具体步骤如下: 1. 创建 WebSocket 对象:使用 `new WebSocket(url)` 方法创建一个 WebSocket 对象,其中 `url` 是 WebSocket 服务器的地址。 2. 监听事件:WebSocket 对象提供了多种事件,如 `onopen`、`onmessage`、`onerror` 和 `onclose` 等。可以通过监听这些事件来处理 WebSocket 的状态和收发数据。 3. 发送消息:使用 `WebSocket.send(data)` 方法向服务器发送消息,其中 `data` 是要发送的数据。 4. 关闭连接:使用 `WebSocket.close()` 方法关闭连接。 下面是一个简单的示例代码: ```javascript // 创建 WebSocket 对象 const socket = new WebSocket('ws://localhost:8080'); // 监听事件 socket.onopen = function() { console.log('WebSocket 连接已建立'); }; socket.onmessage = function(event) { console.log('收到服务器消息:', event.data); }; socket.onerror = function(error) { console.error('WebSocket 错误:', error); }; socket.onclose = function(event) { console.log('WebSocket 连接已关闭'); }; // 发送消息 socket.send('Hello, WebSocket!'); // 关闭连接 socket.close(); ``` ### 回答2: 前端使用WebSocket是一种通过HTTP协议建立的双向通信技术,它可以实现实时的数据传输和接收。前端通过WebSocket与服务器建立连接后,可以发送和接收数据,实现实时更新和交互。 首先,前端需要使用JavaScript中的WebSocket API进行WebSocket的连接,通过WebSocket构造函数可以创建WebSocket对象。在创建WebSocket对象时,需要传入服务器的URL作为参数,指定服务器的地址。 一旦连接建立,前端可以通过WebSocket对象的send方法向服务器发送数据。服务器收到前端发送的数据后,可以处理并给前端返回数据。前端通过WebSocket对象的onmessage事件来监听服务器返回的数据,在收到数据后可以对数据进行处理和展示。 除了发送和接收数据,前端还可以监听WebSocket连接的状态。WebSocket对象有一个readyState属性,可以判断连接的状态,常用的状态有OPEN,CLOSED等。 前端通过WebSocket技术可以实现一些实时性要求较高的功能,比如实时聊天、实时数据展示等。相比传统的HTTP请求和响应模式,WebSocket可以减少不必要的网络延迟和请求开销,提供更好的用户体验。 总而言之,前端使用WebSocket可以在浏览器和服务器之间建立实时的双向通信,通过发送和接收数据,实现实时的更新和交互。这为前端开发提供了更多的可能性,使得Web应用可以更加灵活和实用。 ### 回答3: 前端使用WebSocket是一种实时通信的网络协议,它能够在浏览器和服务器之间建立一个持久的连接,实现双向的即时通信。 传统的网页通信是基于HTTP协议,即浏览器向服务器发送请求,服务器返回响应,这种通信模式无法实现服务器主动向浏览器推送数据。而WebSocket能够解决这个问题,它允许服务器和客户端之间建立一个双向的通信通道,实现实时数据传输。 前端使用WebSocket的步骤如下: 1. 创建WebSocket对象:在浏览器中,我们可以通过JavaScript的`new WebSocket(url)`来创建一个WebSocket对象,其中url是服务器的地址。 2. 监听事件:WebSocket对象有多个事件用于监听不同的状态或数据。常用的事件有`onopen`、`onmessage`、`onclose`和`onerror`。`onopen`事件在连接建立时触发,`onmessage`事件在接收到服务器发送的数据时触发,`onclose`事件在连接关闭时触发,`onerror`事件在遇到错误时触发。 3. 发送和接收数据:可以通过WebSocket对象的`send()`方法向服务器发送数据,服务器通过`onmessage`事件接收到数据后可以进行相应处理,并通过`send()`方法向客户端发送数据。 4. 关闭连接:连接不再需要时,可以通过WebSocket对象的`close()`方法手动关闭连接。 前端使用WebSocket可以实现很多实时性要求较高的功能,例如在线聊天、实时协作、实时数据展示等。它相比于传统的轮询方式,能够减少服务器的压力,提高系统的响应速度。但需要注意的是,由于WebSocket是一种新的协议,不是所有浏览器都支持,因此在使用时需要考虑兼容性问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值