0


uniapp使用uni自带websocket进行即时通讯

最近再办一个uniapp做的即时通讯,把其中思路记载一下。

技术栈采用uniapp+uview+vue2进行开发。

一、使用uni封装好的websocket。

下面的从uniapp官网截图的Api

uni.connectSocket() :这个方法可以让我们创建一个webSocket的连接,里面包含几个参数,url是写ws的连接地址,没有的话肯定是连接不上服务器,其他的没用过。用的时候再看。

// 创建webSocket
this.webSocketTask = uni.connectSocket({
    url: '这里面写的是连接地址',
    header: {
        'content-type': 'application/json'
    },
    success(res) {
        console.log('成功', res);
    },
})

我们在data中定义一个webSocket:null,然后把websocket对象赋给他,以供下面的方法使用。

uni.onSocketOpen()是用来监听websocket连接成功的事件,方法里面跟一个回调函数,可以通过res参数拿到响应头。

//监听WebSocket连接打开事件
this.webSocketTask.onOpen((res) => {
    console.info("监听WebSocket连接打开事件", res)
});

这个没用过,过!!!

通过uni.onSocketMessag()可以接收到服务器返回的消息。

//接收websocket消息及处理
this.webSocketTask.onMessage((res) => {
    let data = JSON.parse(res.data);
//判断服务器返回的type类型
    switch (data.type){
        //如果返回的ping,说明服务端ping客户端
        case 'ping':
            //我们要给服务器说一个pong告诉服务器我还活着
            this.webSocketTask.send({
                data: JSON.stringify({
                    type: 'pong'
                })
            });
            break;
        //登录更新用户列表
        //如果type是init,说明服务器知道我们活着,给我们传一个标识,我们通过这个标识去请求接口,                            
          建立唯一链接。
        case 'init':
            uni.setStorageSync('client_id', data.client_id);
            this.$u.post('common/pub/bindUid',{
                client_id: data.client_id,
                user_id: this.userId
            }).then(res => {
                this.webSocketTask.send({
                    data: JSON.stringify({
                        type: 'bindUid',
                        user_id:2
                    })
                });
            });
            break;
        case 'simple':
            this.userList.push(data.data)
            this.scrollToBottom()
            break;
        case 'group':
            this.userList.push(data.data)
            this.scrollToBottom()
            break
    }

这个的话按官方文档说的就是需要卸载uni。onSocketOpen回调里面才行。但是我直接通过实例对象发也可以。

this.webSocketTask.send({
    data: JSON.stringify({type: 'pong'})
});

注意:websocket只能接收字符串,记得转换类型

这个就是关闭连接,写在onUnload钩子中就行

onUnload(){
    uni.closeSocket({
        success:() => {
            console.info("退出成功")
        },
    })
},

最后一个就是监听websocket是否关闭。

uniapp官网文档:uni.connectSocket(OBJECT) | uni-app官网 (dcloud.net.cn)https://uniapp.dcloud.net.cn/api/request/websocket.html

uni-app官网 (dcloud.net.cn)https://uniapp.dcloud.net.cn/api/request/socket-task.html完整代码:

onLoad(){
    this.socket()
};

methods:{
    socket(){
    //创建webSocket
    this.webSocketTask = uni.connectSocket({
        url: 'ws地址',
        header: {
            'content-type': 'application/json'
        },
        success(res) {
            console.log('成功', res);
        },
    })

    // 监听WebSocket连接打开事件
    this.webSocketTask.onOpen((res) => {
        console.info("监听WebSocket连接打开事件", res)
    });

    // 监听WebSocket错误
    uni.onSocketError((res) => {
        console.info("监听WebSocket错误" + res)
    });
}

onShow(){
    // 接收websocket消息及处理
    this.webSocketTask.onMessage((res) => {
        let data = JSON.parse(res.data);
        switch (data.type) {
            // 服务端ping客户端
            case 'ping':
                this.webSocketTask.send({
                    data: JSON.stringify({
                        type: 'pong'
                    })
                });
                break;
            // 登录 更新用户列表
            case 'init':
                uni.setStorageSync('client_id', data.client_id);
                this.$u.post('接口', {
                    client_id: data.client_id,
                    user_id: this.userId
                }).then(res => {
                    this.webSocketTask.send({
                        data: JSON.stringify({
                            type: 'bindUid',
                            user_id: this.userId
                        })
                    });
                });
                break;
            case 'simple':
                this.userList.push(data.data)
                this.scrollToBottom()
                break;
            case 'group':
                // this.groupMenuList()
                this.userList.push(data.data)
                this.scrollToBottom()
                break
        }

    });
}

onUnload() {
    uni.closeSocket({
        success: () => {
            console.info("退出成功")
        },
    })
},

只是个人简单记录!!!


本文转载自: https://blog.csdn.net/weixin_67299751/article/details/129416286
版权归原作者 青岛前端大冤种 所有, 如有侵权,请联系我们删除。

“uniapp使用uni自带websocket进行即时通讯”的评论:

还没有评论