【uni-app】封装websokcet以及使用方法

在使用uniapp开发一个IM即时通讯系统时,需要用到websocket协议,包括对话等等

vue封装sokect传送门

uni中封装websokect.js

//是否已经连接上ws
let isOpenSocket = false
//心跳间隔,单位毫秒
let heartBeatDelay = 3000
let heartBeatInterval = null
//心跳时发送的消息文本
let heartBeatText = ""
//最大重连次数
let reconnectTimes = 10
let reconnectInterval = null
//重连间隔,单位毫秒
let reconnectDelay = 3000

let wsUrl = "ws://82.157.123.54:9010/ajaxchattest" // 可以测试用

let socketTask = null

//这个参数是防止重连失败之后onClose方法会重复执行reconnect方法,导致重连定时器出问题
//连接并打开之后可重连,且只执行重连方法一次
let canReconnect = false

//封装的对象,最后以模块化向外暴露,
//init方法 初始化socketTask对象
//completeClose方法 完全将socketTask关闭(不重连)
//其他关于socketTask的方法与uniapp的socketTask api一致
let ws = {
    socketTask: null,
    init,
    send,
    completeClose
}

function init(agentData, messageCallback) { // 两个参数:发送不同的标识&处理接收消息
    socketTask = uni.connectSocket({
        url: wsUrl,
        complete: () => {}
    })
    socketTask.onOpen((res) => {
        console.log("ws连接成功")
        clearInterval(heartBeatInterval)
        clearInterval(reconnectInterval)
        isOpenSocket = true
        canReconnect = true
        send(JSON.stringify(agentData));
        //开启心跳机制
        // heartBeat()
    })
    socketTask.onMessage((res) => {
        //自定义处理onMessage方法
        // console.log(res)
        onWsMessage(res, messageCallback)//

        
    })
    socketTask.onClose(() => {
        if (isOpenSocket) {
            console.log("ws与服务器断开")
        } else {
            console.log("连接失败")
        }
        isOpenSocket = false
        if (canReconnect) {
            reconnect()
            canReconnect = false
        }
    })
    ws.socketTask = socketTask
}

function heartBeat() {
    heartBeatInterval = setInterval(() => {
        console.log(heartBeatText)
        send(JSON.stringify(heartBeatText));
    }, heartBeatDelay)
}

function onWsMessage(event, messageCallback) { // 处理接收消息
    const jsonStr = event.data
    writeToScreen('onWsMessage接收到服务器的数据: ', jsonStr)
    messageCallback(jsonStr)
}

function send(value) {
    ws.socketTask.send({
        data: value,
        async success() {
            console.log("消息标识发送成功",value)
        }
    });
}

function reconnect() {
    //停止发送心跳
    clearInterval(heartBeatInterval)
    //如果不是人为关闭的话,进行重连
    if (!isOpenSocket) {
        let count = 0;
        reconnectInterval = setInterval(() => {
            console.log("正在尝试重连")
            init();
            count++
            //重连一定次数后就不再重连
            if (count >= reconnectTimes) {
                clearInterval(reconnectInterval)
                console.log("网络异常或服务器错误")
            }
        }, reconnectDelay)
    }
}

function completeClose() {
    //先将心跳与重连的定时器清除
    clearInterval(heartBeatInterval)
    clearInterval(reconnectInterval)
    canReconnect = false
    ws.socketTask.close()
}

module.exports = ws

使用时需要在main.js引入并绑定在Vue的prototype上,这样就可以做到全局变量了
main.js

import ws from '路径' //找好自己的路径
Vue.prototype.$ws = ws

当你在某个vue页面需要使用socketTask的话,需要调用this.$ws.init(‘发送标识’,‘处理方法’)

在这里插入图片描述
发送消息
在这里插入图片描述

常见问题:为什么不是在main.js就把socketTask对象初始化呢?

因为大部分情况下socketTask对象是需要在一定条件下才初始化的,比如在登录之后,才需要使用。而不是一打开APP就去连接后端的websocket服务器了。

当然,如果需要在main.js中把socketTask对象初始化,可以直接在main.js中调用init方法

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,它可以让客户端和服务器之间进行实时通信。在使用 WebSocket 时,客户端和服务器之间会建立一个长连接,这样客户端就可以向服务器发送数据,并从服务器接收数据。相比于传统的 HTTP 请求,WebSocket 的优势是可以实现实时通信,而且不需要频繁地发起请求和响应。 下面是使用 WebSocket 的基本步骤: 1. 客户端向服务器发起 WebSocket 连接请求。 2. 服务器接收到 WebSocket 连接请求,并建立连接。 3. 客户端和服务器之间进行实时通信。 4. 当通信结束时,客户端和服务器都可以关闭连接。 在 JavaScript 中,可以使用 WebSocket 对象来实现 WebSocket 通信。以下是一个简单的 WebSocket 示例: ```javascript // 创建 WebSocket 对象 var ws = new WebSocket('ws://localhost:8080'); // 监听连接事件 ws.onopen = function() { console.log('WebSocket 已连接'); }; // 监听消息事件 ws.onmessage = function(evt) { console.log('收到消息:' + evt.data); }; // 发送消息 ws.send('Hello, WebSocket!'); // 关闭连接 ws.close(); ``` 在上面的示例中,我们首先创建了一个 WebSocket 对象,然后监听了连接事件和消息事件。当连接建立成功时,会触发 onopen 事件;当收到消息时,会触发 onmessage 事件。我们还可以使用 send 方法向服务器发送消息,使用 close 方法关闭连接。 在服务器端,也可以使用 WebSocket 对象来实现 WebSocket 通信。具体实现方式可以参考各种编程语言的 WebSocket 库和示例代码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值