Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >微信小程序中websocket的运用

微信小程序中websocket的运用

作者头像
越陌度阡
发布于 2020-11-26 06:51:45
发布于 2020-11-26 06:51:45
1.4K00
代码可运行
举报
运行总次数:0
代码可运行

近期在开发一个类似于小年糕的小程序,当用户在合成影集后会立马跳到个人中心的影集列表,但是立刻跳过去,服务端并没有马上制作完成,所以会有个“影集正在制作中”的提示,为了避免用户退出页面重新请求查看影集是否制作完成,决定前后端通信采用websocket通信的方式,当有影集制作完成时,服务端可实时向用户推送消息。

websocket在实现时需要注意以下几点:

1. 微信小程序同时只能有一个 WebSocket 连接,如果当前已存在一个 WebSocket 连接,会自动关闭该连接,并重新创建一个 WebSocket 连接。

2. WebSocket 链接默认和最大超时时间都是 60s,超过了这个时间会自动断开,所以要设置一个心跳链接。

3. 页面在卸载时要关闭socket的链接。

以下是websocket连接及心跳的实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 域名地址(项目实地址)
const Host = 'wss://xxxx:0000';

// Socket连接成功
var socketOpen = false;
// Socket关闭
var socketClose = false;
// 消息队列
var socketMsgQueue = [];

// 判断心跳变量
var heart = null;
// 心跳失败次数
var heartBeatFailCount = 0;
// 终止心跳
var heartBeatTimeout = null;
// 终止重连
var connectSocketTimeout = null;

var webSocket = {
    // 连接Socket
    connectSocket:function(options) {
        wx.showLoading({
            title: '正在请求中',
            mask: true,
        });
        socketOpen = false;
        socketClose = false;
        socketMsgQueue = [];
        wx.connectSocket({
            url:Host,
            success:function(res) {
                if (options) {
                    options.success && options.success(res);
                }
            },
            fail:function(res) {
                if (options) {
                    options.fail && options.fail(res);
                }
            }
        })
    },
    // 发送消息
    sendSocketMessage:function(options) {
        if (socketOpen) {
            wx.sendSocketMessage({
                data: options.msg,
                success: function(res) {
                    if (options) {
                        options.success && options.success(res);
                    }
                },
                fail: function(res) {
                    if (options) {
                        options.fail && options.fail(res);
                    }
                }
            })
        } else {
            socketMsgQueue.push(options.msg)
        }
    },
    // 关闭Socket
    closeSocket: function(options) {
        if (connectSocketTimeout) {
            clearTimeout(connectSocketTimeout);
            connectSocketTimeout = null;
        };
        socketClose = true;
        this.stopHeartBeat();
        wx.closeSocket({
            success: function(res) {
                if (options) {
                    options.success && options.success(res);
                }
            },
            fail: function(res) {
                if (options) {
                    options.fail && options.fail(res);
                }
            }
        })
    },
    // 收到消息
    onSocketMessageCallback: function(msg) {},

    // 开始心跳
    startHeartBeat: function() {
        heart = true;
        this.heartBeat();
    },

    // 正在心跳
    heartBeat: function() {
        var that = this;
        if (!heart) {
            return;
        };
        that.sendSocketMessage({
            msg: JSON.stringify({
                // 与后端约定,传点消息,保持链接
                "msg_type": "heart"
            }),
            success: function(res) {
                if (heart) {
                    heartBeatTimeout = setTimeout(() => {
                        that.heartBeat();
                    }, 7000);
                }
            },
            fail: function(res) {
                if (heartBeatFailCount > 2) {
                    that.connectSocket();
                };
                if (heart) {
                    heartBeatTimeout = setTimeout(() => {
                        that.heartBeat();
                    }, 7000);
                };
                heartBeatFailCount++;
            },
        });
    },

    // 结束心跳
    stopHeartBeat: function() {
        heart = false;
        if (heartBeatTimeout) {
            clearTimeout(heartBeatTimeout);
            heartBeatTimeout = null;
        };
        if (connectSocketTimeout) {
            clearTimeout(connectSocketTimeout);
            connectSocketTimeout = null;
        }
    }
};

// 监听WebSocket打开连接
wx.onSocketOpen(function(res) {
    wx.hideLoading();
    // 如果已经关闭socket
    if (socketClose) {
        webSocket.closeSocket();
    } else {
        socketOpen = true
        for (var i = 0; i < socketMsgQueue.length; i++) {
            webSocket.sendSocketMessage(socketMsgQueue[i])
        };
        socketMsgQueue = []
        webSocket.startHeartBeat();
    }
});

// 监听WebSocket错误
wx.onSocketError(function(res) {
    console.log('WebSocket连接打开失败,请检查!', res);
});
// 监听WebSocket接受到服务器的消息
wx.onSocketMessage(function(res) {
    webSocket.onSocketMessageCallback(res.data);
});

// 监听WebSocket关闭连接后马上重连
wx.onSocketClose(function(res) {
    if (!socketClose) {
        clearTimeout(connectSocketTimeout);
        connectSocketTimeout = setTimeout(() => {
            webSocket.connectSocket();
        }, 3000);
    }
});

module.exports = webSocket;

以下是页面中的使用,其中在onSocketMessageCallback里面会有消息回调。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const WebSocket = require('../../public/websocket.js');

Page({
    // 页面加载
    onLoad: function(options) {
        // 创建连接
        WebSocket.connectSocket();
        // 设置接收消息回调
        WebSocket.onSocketMessageCallback = this.onSocketMessageCallback;
    },

    // Socket收到的信息
    onSocketMessageCallback: function(res) {
        console.log(res);
    },
    // 页面销毁时关闭连接
    onUnload: function(options) {
        WebSocket.closeSocket();
    },
})
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/08/27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
微信小程序websocket正确姿势
1.请求地址必须是ws://或wss:// var wsurl = 'wss://zsj.itdos.net/v1' 2.服务端websocket必须返回文件头protocol 小程序端请求会发
hotqin888
2021/08/10
1.4K0
【黄啊码】微信小程序:webSocket的使用手册
创建一个 WebSocket 连接;一个微信小程序同时只能有一个 WebSocket 连接,如果当前已存在一个 WebSocket 连接,会自动关闭该连接,并重新创建一个 WebSocket 连接。
黄啊码
2022/01/09
7920
微信小程序开发实战(23):WebSocket实战
WebSocket是一种在单个TCP 连接上进行全双工通讯的协议。 在WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以建立持久性的连接,并进行双向数据传输。
蒙娜丽宁
2020/08/31
2.3K0
微信小程序开发实战(23):WebSocket实战
流动图书馆小程序实战
流动图书馆是一个图书漂流和借阅工具,旨在共享闲置图书,并链接趣味相投的小伙伴。
疯狂的小程序
2018/01/25
2.2K1
前端 实战项目·WebSocket 心跳重连机制
WebSocket 是一种网络通信协议,它使得客户端和服务器之间的数据交换变得更加简单。最近在项目中使用 WebSocket 实现了一个简单在线聊天室功能,在此探究下心跳重连的机制。
数媒派
2022/12/01
4.9K1
通信系列 | Websocket在微信小程序的用法
使用Websocket的及时通讯实现直播间的评论、加入直播间、离开直播间、点赞、关注、商品上下架等操作。
Tinywan
2021/01/28
4.6K0
js实现websocket
小小咸鱼YwY
2023/07/31
1.3K0
小程序的十万个为什么丨第一期
A:可以使用websocket进入页面时建立连接,服务器端一旦有消息,就可以推送客户端了。然后根据服务器端相应,把信息显示出来就行了。
极乐君
2018/07/31
5030
小程序的十万个为什么丨第一期
微信小程序和服务器通信-WebSocket
接上一篇文章的话题,我们这次来讲一下如何建立一个基于node.js的WebSocket服务器,并在小程序中使用这个提供实时服务的服务器。
一斤代码
2018/08/21
6.8K2
微信小程序和服务器通信-WebSocket
Swoole跟thinkphp5结合开发WebSocket在线聊天通讯系统教程
这里的路径,是因为我绑定了home模块为默认模块,tp5默认情况是:php public/index.php index/Websocket/start)
猿哥
2019/03/29
1.9K0
Swoole跟thinkphp5结合开发WebSocket在线聊天通讯系统教程
【愚公系列】2022年04月 微信小程序-项目篇(公交查询)-02周边站点-获取位置和城市信息
逆地址解析:提供由经纬度到文字地址及相关位置信息的转换能力,广泛应用于物流、出行、O2O、社交等场景。服务响应速度快、稳定,支撑亿级调用。
愚公搬代码
2022/04/30
3610
如何在小程序中实现 WebSocket 通信
在以前的文章中,我们介绍了HTTP通讯,这种通讯有一个缺点,如果我想从直接从服务器发消息给客户端,需要客户端先发起HTTP请求后服务器才能返回数据,且后续服务器想发送数据给客户端都需要客户端先发起请求,但这种方案在一些特殊场景应用的时候非常消耗资源,比如聊天室,如果使用HTTP请求,需要客户端每隔一段时间就请求一次服务器,再由服务器返回数据。这种传统的模式带来很明显的缺点,即客户端需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。
Lonely永夜
2018/11/15
21.7K2
如何在小程序中实现 WebSocket 通信
微信小程序使用WebSokcet实现相关请求
以前做小程序为了应急找了个插件去链接WebSokcet,文章传送门。
疯狂的小程序
2018/01/26
2K0
性能测试之微信小程序websocket协议
最近复习性能测试,也想看看小程序聊天页面中的信息底层是怎么实现的,今天试着写了写。
高楼Zee
2019/12/27
1K0
性能测试之微信小程序websocket协议
小程序与后端服务的对接实践
小程序的核心价值在于其轻量级、高效、易于使用的特性,而后端服务的对接则是小程序开发中的关键环节。一个良好的前后端协作不仅能提升用户体验,还能提高系统的稳定性和可扩展性。本文将详细介绍小程序与后端服务的对接流程、关键技术点,并结合具体实例进行解析。
LucianaiB
2025/01/29
1550
WebSocket 实现数据实时刷新
浏览器通过 JavaScript 向服务器发出建立 WebSocket 连接的请求,连接建立以后,客户端和服务器端就可以通过 TCP 连接直接交换数据。
青梅煮码
2023/02/18
4.9K0
【愚公系列】《微信小程序与云开发从入门到实践》038-在小程序中使用WebSocket技术
在当今信息化时代,实时数据交互已成为应用程序的重要特性之一。小程序作为一种新兴的轻量级应用,越来越多地被用于即时通讯、在线游戏、实时更新等场景。而WebSocket技术,凭借其持久连接和低延迟的优势,成为实现实时数据传输的理想选择。
愚公搬代码
2025/01/25
2460
微信小程序+php实现即时通讯聊天功能
Github:https://github.com/swoole/swoole-src/tags
黄啊码
2022/05/10
2.1K0
微信小程序+php实现即时通讯聊天功能
微信小程序远程控制电脑屏幕
作者:德里克--腾讯前端工程师 @IMWeb前端社区 背景 宇宙第一PHP花叔最近家里在装修,安装了一个投影仪,把电脑的画面投影到墙上,通过操控电脑来切换投影的画面。有一天他突然问我,我们能不能通过一个微信小程序来远程控制投影屏幕呢?接着我们讨论了一下,确实可以,因为微信小程序有WebSocket API。WebSocket虽不是新技术,但它结合微信小程序这个新产品,未来将诞生出更多线上线下的应用场景,值得我们关注。于是做了下面这个简易的DEMO,利用微信小程序来远程控制电脑屏幕。 开发过程 1、WebSo
用户1097444
2022/06/29
2.1K0
微信小程序远程控制电脑屏幕
uniapp 中实现socket通信的方法
代码在文章下面,但还是有个bug没有解决:v-html显示消息列表时,在微信小程序中显示不了。但网页测试又是正常的。
用户9914333
2024/01/12
2.5K0
uniapp 中实现socket通信的方法
相关推荐
微信小程序websocket正确姿势
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验