uniapp中websokcet封装和使用
1. websocket.js 封装代码
- //是否已经连接上ws
- let isOpenSocket = false
- //心跳间隔,单位毫秒
- let heartBeatDelay = 3000
- let heartBeatInterval = null
- //心跳时发送的消息文本
- let heartBeatText = "PING"
- //最大重连次数
- let reconnectTimes = 10
- let reconnectInterval = null
- //重连间隔,单位毫秒
- let reconnectDelay = 3000
- let wsUrl = "ws://xxxxxxxxxxxx" //ws请求 或者 wss
- let socketTask = null
- //这个参数是防止重连失败之后onClose方法会重复执行reconnect方法,导致重连定时器出问题
- //连接并打开之后可重连,且只执行重连方法一次
- let canReconnect = false
- //封装的对象,最后以模块化向外暴露,
- //init方法 初始化socketTask对象
- //completeClose方法 完全将socketTask关闭(不重连)
- //其他关于socketTask的方法与uniapp的socketTask api一致
- let ws = {
- socketTask: null,
- init,
- completeClose,
- send
- }
- function init() {
- socketTask = uni.connectSocket({
- url: wsUrl,
- complete: (res)=> {console.log("WebSocket连接成功",res)}
- })
- socketTask.onOpen((res) => {
- console.log("WebSocket连接已打开",res)
- clearInterval(heartBeatInterval)
- clearInterval(reconnectInterval)
- isOpenSocket = true
- canReconnect = true
- //开启心跳机制 向websocket发送数据,json格式,参数:sceneId
- heartBeat()
- })
- socketTask.onMessage((res) => {
- // 每次返回的数据不一样,需要加入判断
- console.log('收到服务器内容',JSON.parse(res.data))
- let result = JSON.parse(res.data)
//这边可以根据推送的数据, 做相应的 do somethings, 根据自己需求, 下面只是例子..- // token存在,说明,小程序用户点击了授权(比如推送的数据有token,那就做什么事xxxx
- if(result.token){
- uni.setStorageSync('token', result.token)
- uni.setStorageSync('userInfo', JSON.stringify(result.userInfo))
- }
- // client_id存在,说明连websocket接成功
- if(result.msg=="连接成功"){
- uni.setStorageSync('client_id', result.data.client_id);
- }
- // JSON.parse(res.data).msg=="已归还导览机", 已归还导览机,清空用户缓存
- if(result.msg=="已归还导览机"){
- // 返回首页,清空数据
- uni.clearStorageSync();
- uni.navigateBack({
- delta: 100
- })
- }
- })
- 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)
- uni.getSystemInfo({
- success: function (res) {
- console.log('设备id----',res.deviceId);//设备id
- uni.setStorageSync('deviceId', res.deviceId)
- let obj = {
- sceneId:res.deviceId
- }
- send(JSON.stringify(obj));
- }
- });
- }, heartBeatDelay)
- }
- // 发送消息
- function send(value) {
- ws.socketTask.send({
- data: value,
- async success(res) {
- console.log("消息发送成功",res)
- }
- });
- }
- 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
2. 使用时在main.js引入并绑定在Vue的prototype上,这样就可以做到全局变量了main.js
- import ws from 'ws.js' //找好自己的路径
- Vue.prototype.$ws = ws
3. 页面调用
比如在 A页面调用
- onLoad() {
- let _this = this;
- _this.$ws.init()//初始化websocket
- }
4. 里面封装的 send方法等也都可以用 // this.$ws.send(JSON.stringify(obj))
uniapp中websokcet封装和使用的更多相关文章
- uniapp中拿到base64转blob对象,或base64转bytes字节数组,io操作写入字节流文件bytes
1. uniAPP中拿到附件的base64如何操作,如word文件 /*** 实现思路:* 通过native.js的io操作创建文件,拿到平台绝对路径* 再通过原生类进行base64解码,拿到字节流b ...
- Java中的封装
在前面的一些日子里,一只都在学习C#语言,使用C#在做一些小项目的,今天转到了Java的学习,还是感觉有点的不习惯,没有以前的中文界面的,全是英文.写起代码来都一直保持着C#中的编码的习惯,但是学习J ...
- C++内存中的封装、继承、多态(下)
上篇讲述了内存中的封装模型,下篇我们讲述一下继承和多态. 二.继承与多态情况下的内存布局 由于继承下的内存布局以及构造过程很多书籍都讲得比较详细,所以这里不细讲.重点讲多态. 继承有以下这几种情况: ...
- C++内存中的封装、继承、多态(上)
C++内存中的封装.继承.多态(上) 继我的上一篇文章:浅谈学习C++时用到的[封装继承多态]三个概念 此篇我们从C++对象内存布局和构造过程来具体分析C++中的封装.继承.多态. 一.封装模型的内存 ...
- Uni-app中Class绑定与Style绑定
为了节约性能,我们将Class与Style的表达式通过compiler硬编码到uni-app中 支持语法和转换效果如下: Class支持语法: <view :class="{ acti ...
- Struts2把数据封装到集合中之封装到Collection中
数据封装到集合中,可以封装到集合中,也可以封装到Map中.该篇博客主要讲解数据封装到集合中的封装到Collection中. 1. 封装复杂类型的参数(集合类型 Collection .Map接口等) ...
- 如何在Javascript中利用封装这个特性
对于熟悉C#和Java的兄弟们,面向对象的三大思想(封装,继承,多态)肯定是了解的,那么如何在Javascript中利用封装这个特性呢? 我们会把现实中的一些事物抽象成一个Class并且把事物的属性( ...
- 2018.2.2 JavaScript中的封装
JavaScript中的封装 1.封装的概念 通过将一个方法或者属性声明为私用的,可以让对象的实现细节对其他对象保密以降低对象之间的耦合程度,可以保持数据的完整性并对其修改方式加以约束,这样可以使代码 ...
- 优雅的在WinForm/WPF/控制台 中使用特性封装WebApi
优雅的在WinForm/WPF/控制台 中使用特性封装WebApi 说明 在C/S端作为Server,建立HTTP请求,方便快捷. 1.使用到的类库 Newtonsoft.dll 2.封装 HttpL ...
随机推荐
- 第五篇- 抖音的强大对手来了,用Flutter手撸一个抖音国际版,看看有多炫
前言 由于中间几个月项目天天加班,导致没没时间更新,最近一段时间对前端进行了重构,加了很多页面,如登录.注册.关注.个人中心等,目前写这个纯属业余个人爱好,所以断断续续的继续在做...... 前端地址 ...
- tensorflow core 核心目标依赖图
Tensorflow的核心代码在core模块中,56w行的代码量让人望而生畏,熟悉了bazel工具之后,发现BUILD文件是理清代码结构的很好的资源,但使用bazel query语法提取出来//ten ...
- 内网穿透工具--frp
对于没有公网 IP 的内网用户来说,远程管理或在外网访问内网机器上的服务是一个问题. 今天给大家介绍一款好用内网穿透工具 FRP,FRP 全名:Fast Reverse Proxy.FRP 是一个使用 ...
- SMB共享配置
SMB 使用命令挂载和卸载SMB文件系统 自动挂载SMB文件系统 红帽企业 ...
- 三层PetShop架构设计
<解剖 PetShop >系列之一 前言: PetShop 是一个范例,微软用它来展示 .Net 企业系统开发的能力.业界有许多 .Net 与 J2EE 之争,许多数据是从微软的 Pe ...
- 有限差分法(Finite Difference Method)解方程:边界和内部结点的控制方程
FDM解常微分方程 问题描述 \[\frac{d^2\phi}{dx^2}=S_{\phi} \tag{1} \] 这是二阶常微分方程(second-order Ordinary Differenti ...
- SpringAOP--代理
前言 在Spring或者SpringBoot中,可以通过@Aspect注解和切点表达式等配置切面,实现对某一功能的织入.然而其内部到底是如何实现的呢? 实际上,Spring在启动时为切点方法所在类生成 ...
- 什么是 YAML?
YAML 是一种人类可读的数据序列化语言.它通常用于配置文件. 与属性文件相比,如果我们想要在配置文件中添加复杂的属性,YAML 文件就更加 结构化,而且更少混淆.可以看出 YAML 具有分层配置数据 ...
- mq 的缺点 ?
系统可用性降低 系统引入的外部依赖越多,越容易挂掉,本来你就是 A 系统调用 BCD 三个系统的 接口就好了,人 ABCD 四个系统好好的,没啥问题,你偏加个 MQ 进来,万一 MQ 挂了咋整?MQ ...
- 在JAVA中如何跳出当前的多重嵌套循环?
在Java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break语句,即可跳出外层循环.