websocket封装

一、HTML5 WebSocket
WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。

1.1、创建WebSocket 实例

var ws= new WebSocket(url,[protocol]);

以上代码用于创建 WebSocket 对象,其中的第一个参数 url, 即为指定连接的 URL。第二个参数 protocol 是可选的,指定了可接受的子协议。一般来说,大多没有具体要求的,就只用写url即可。

1.2websocket属性
例如:var ws = new WebSocket(‘ws://1xx.xxx.xxx.xxx:8080/ws’); 打印出创建的socket对象,内容如下,这些也正是wensocket的属性。

	binaryType: "blob"      //返回websocket连接所传输二进制数据的类型,如果传输的是Blob类型的数据,则为"blob",如果传输的是Arraybuffer类型的数据,则为"arraybuffer"
	bufferedAmount: 0    //为只读属性,用于返回已经被send()方法放入队列中但还没有被发送到网络中的数据的字节数。
	extensions: ""
	onclose: ƒ ()      //连接关闭时触发
 	onerror: ƒ ()      //通信发生错误时触发
  onmessage: ƒ (e)      //客户端接收服务端数据时触发,e为接受的数据对象
  onopen: ƒ ()       //连接建立时触发
  protocol: ""       //用于返回服务器端选中的子协议的名字;这是一个在创建websocket对象时,在参数protocols中指定的字符串。
  readyState: 1      //返回值为当前websocket的链接状态
  url: "ws://1xx.xxx.xxx.xxx:8080/ws"    //返回值为当构造函数创建WebSocket实例对象时URL的绝对路径。

1.3 websocket属性之readyState
readyState返回当前websocket的链接状态,共有4种。可根据具体项目的需求来利用此状态,写对应的需求。

CONNECTING:值为0,表示正在连接。
OPEN:      值为1,表示连接成功,可以通信了。
CLOSING:   值为2,表示连接正在关闭。
CLOSED:    值为3,表示连接已经关闭,或者打开连接失败。

1.4 websocket的方法
ws.send()
使用连接发送数据,可以发送你想要发送的各种类型数据,如Blob对象、ArrayBuffer 对象、基本或复杂的数据类型等;如:

ws.send('消息');
//发送对象需要格式转换,接受数据同理
ws.send(JSON.stringify(data));

ws.close() :
关闭连接,用户可以主动调取此方法,来关闭连接。

二、封装websocket
可在项目中定义一个socket.js文件,在需要建立socket的页面引入此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 websocketUrl =  process.env.VUE_APP_API_WEBSOCKET_URL;

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

//初始化websocket
function initWebSocket(callback) {
    //此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.heartbeatData);
    isConnect = true;
    heartCheck.start();
    reConnectNum = 0;
}

//客户端接收服务端数据时触发,e为接受的数据对象
function webSocketOnMessage(e) {
    console.log("websocket信息:");
    console.log(e.data)
    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
};

三、使用此socket.js文件(主要在vue项目中使用封装的socket)
1、引入

import Vue from 'vue'
import socketApi from "./utils/socket";//找到封装的socket.js文件
Vue.prototype.socketApi = socketApi;//将其挂在原型上,这样 $socketApi就在所有的 Vue 实例中可用了。

2、在某一页面

<template>
</template>
<script>
export default {
	mounted(){
	   // 建立socket连接, 并设置socket信息返回接受函数   
	   this.$socketApi.initWebSocket(this.getsocketResult);
	},
	beforeDestroy(){
	   this.$socketApi.closeWebSocket();
	},
	methods:{
	   // socket信息返回接受函数
	   getsocketResult(data) {
	     console.log(data);
	   },
	   //发送socket信息
	   websocketSend(data) {
	     this.$socketApi.sendSock(data);
	   }
	}
}
</script>
<style>
</style>
  • 7
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
在Vue3中,我们可以通过封装Websocket类来实现对Websocket的使用。通过引用和可以得知,在Vue3中使用Websocket可以实现实时数据传输。为了方便使用,我们可以封装一个好用的Websocket类。具体步骤如下: 1. 首先,安装Websocket的依赖,可以通过npm或yarn等包管理工具进行安装。 2. 创建一个Websocket类,该类应该包含Websocket的连接、发送消息和接收消息的方法。可以参考引用中提到的封装Websocket类的方法。 3. 在Vue3中,可以将Websocket封装成一个Vue插件,以便全局使用。具体步骤如下: - 创建一个插件文件,例如`websocket-plugin.js`。 - 在插件文件中,引入Websocket类并创建一个Vue插件对象。 - 在插件对象的`install`方法中,将Websocket实例挂载到Vue的原型上,以便在组件中可以通过`this.$websocket`来访问Websocket实例。 - 最后,导出该插件对象。 - 示例代码如下: ```javascript import Websocket from './websocket.js'; const WebsocketPlugin = { install(Vue) { Vue.prototype.$websocket = new Websocket('ws://localhost:8080'); }, }; export default WebsocketPlugin; ``` 4. 在Vue项目中,将该插件引入并使用。可以在`main.js`或其他入口文件中使用`app.use()`方法来安装该插件。示例代码如下: ```javascript import { createApp } from 'vue'; import App from './App.vue'; import WebsocketPlugin from './websocket-plugin.js'; const app = createApp(App); app.use(WebsocketPlugin); app.mount('#app'); ``` 通过以上步骤,我们就可以在Vue3中封装Websocket,并在全局范围内使用了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [基于Vue3封装一个好用的Websocket](https://blog.csdn.net/qq_27244301/article/details/130098672)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值