微信小程序websocket
微信小程序websocket
微信小程序带有websocket可以提供使用,但是官方文档写的东西很少,而且小程序后台能力弱这一点也是十分的坑爹,这就导致了socket长连接一切后台就会出现断开的情况,并且难受的是.这个时候你重新调用链接函数也会链接不上,可能直接影响到你的业务逻辑
解决方法就是手动关闭和开启链接,不要让链接在程序切后台的时候被关掉,代码如下↓
- onHide监听程序进入后台的时候,手动关闭链接
onHide: function() {
var that = this;
console.log('程序进入了后台');
that.closeSocket();
}
- onShow监听程序进入后台的时候,手动开启链接
onShow: function() {
var that = this;
that.connectSocket();
}
- connectSocket函数
/**
* 链接会话,
* 每间隔一秒链接一次,知道链接成功后停止链接
*/
connectSocket() {
var that = this;
var wss_linker = setInterval(function() {
if (that.globalData.user) {
that.globalData.socketTask = wx.connectSocket({
url: that.globalData.socket_url + that.globalData.user.userId,
fail: function(res) {
wx.showModal({
title: '提示',
content: 'socket链接异常,请删除程序重试',
})
}
})
//监听链接开启
that.globalData.socketTask.onOpen(function(res) {
that.globalData.isConnect = true;
var keep_msg = "keep_connect";
that.globalData.keepConnectInterval = setInterval(function() {
wx.sendSocketMessage({
data: keep_msg,
})
console.log(keep_msg)
if (JSON.stringify(that.globalData.newMsg) == "{}") {
that.globalData.have_new_msg = false;
}
}, 1000)
//获取离线消息
that.get_old_msg(res => {
// 获取在线消息
that.globalData.socketTask.onMessage(function(res) {
var storage_msg = [];
var msg_obj = JSON.parse(res.data);
if (msg_obj.code && msg_obj.code == -1) {
wx.showModal({
title: '发送通知',
content: msg_obj.msg,
})
// that.globalData.flag=true;
} else {
wx.showToast({
title: 'You got a msg'
})
// 处理时间
that.format_date(msg_obj.chatTime, res => {
msg_obj.chatTime = res
var chatRequestUserId = msg_obj.chatRequestUserId + "";
// 把获取的消息存入缓存
that.set_chat_storage(chatRequestUserId, msg_obj);
that.update_unread_msg(chatRequestUserId, msg_obj);
})
}
})
})
console.log('webSocket is open');
})
that.globalData.socketTask.onClose(function(res){
that.globalData.isConnect = false;
})
clearInterval(wss_linker); //停止计时器
} else {
console.log('还没有链接')
}
}, 1000)
}
- closeSocket函数
/**
* 关闭socket
*/
closeSocket(){
var that=this;
that.globalData.socketTask.close();
clearInterval(that.globalData.keepConnectInterval);
}
在connectSocket函数中,将建立socket链接返回的socketTask储存在全局变量,用以后续的消息监听、消息发送和socket断开。同时,这里用了全局变量,是为了保持链接一直只有一个。减少程序
错误的情况
ps:这个项目要求在小程序里面做一个聊天的模块=-= 不过也借此熟悉了socket的前后端应用
微信小程序websocket的更多相关文章
- 微信小程序 WebSocket 使用非 443 端口连接
前言 微信小程序支持使用 WebSocket 连接到服务器,准确地说是带 SSL 的 WebSocket,而微信小程序中不允许使用带端口的 wss 连接,只能使用 443 端口.想使用其他端口就需要在 ...
- 微信小程序-WebSocket
wx.connectSocket(OBJECT) 创建一个 WebSocket 连接:一个微信小程序同时只能有一个 WebSocket 连接,如果当前已存在一个 WebSocket 连接,会自动关闭该 ...
- 微信小程序-WebSocket应用
为何有 HTTP 协议还需要 WebSocket ? Http协议 有个缺陷:通信只能由客户端发起.举例来说,我们想了解今天的天气,只能是客户端向服务器发出请求,服务器返回查询结果.HTTP 协议做不 ...
- 快速上手微信小程序webSocket
WebSocket是一种在单个TCP连接上进行全双工通信的协议.WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范.WebSocket API也被W3 ...
- 微信小程序WebSocket报错:Error during WebSocket handshake: Sent non-empty 'Sec-WebSocket-Protocol' header but no response was received
Error during WebSocket handshake: Sent non-empty 'Sec-WebSocket-Protocol' header but no response was ...
- 微信小程序(应用号)资源汇总整理
微信小应用资源汇总整理 开源项目 WeApp - 微信小程序版的微信 wechat-weapp-redux-todos - 微信小程序集成Redux实现的Todo list wechat-weapp- ...
- 微信小程序(应用号)开发资源汇总整理 - 一直更新中
开源项目 wechat-weapp-gank - 微信小程序版Gank客户端 wechat-dribbble - 微信小程序-Dribbble wechatApp-demo - 微信小程序 DEMO ...
- 黄聪:微信小程序(应用号)资源汇总整理(转)
微信小应用资源汇总整理 开源项目 WeApp - 微信小程序版的微信 wechat-weapp-redux-todos - 微信小程序集成Redux实现的Todo list wechat-weapp- ...
- 微信小程序踩坑集合
1:官方工具:https://mp.weixin.qq.com/debug/w ... tml?t=1476434678461 2:简易教程:https://mp.weixin.qq.com/debu ...
随机推荐
- 简单Tomcat HTTP RPC框架
RPC基础知识 什么是RPC? RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. ...
- H5开发过程中修复的bug记录
从2016年8月1日开始真正意义上的修复bug,也是自己开发之路的开端,希望在这里记录自己修bug过程中遇到的问题及解决方法,待能够自己开发需求的时候,计划记录开发新需求过程中遇到的问题,并且记录自己 ...
- [CQOI 2018]破解D-H协议
Description 题库链接 给出 \(A,B,P,g\) ,\(g\) 是 \(P\) 的原根,求出 \(A\equiv g^a\pmod{P}\) , \(B\equiv g^b\pmod{P ...
- UIKit 框架之UISearchBar、UITableViewController
// // tableViewController.m // tableVC // // Created by City--Online on 15/6/1. // Copyright (c) 201 ...
- Git报错:error: cannot open .git/FETCH_HEAD: Read-only file system
Git:git pull时报错 error: cannot open .git/FETCH_HEAD: Read-only file system 查看该文件: 未在网上找到解决办法,重启服务器就好了 ...
- 整理 node-sass 安装失败的原因及解决办法
npm install 时偶尔遇到报错:没有安装python或node-sass 安装失败的问题,百度之后发现是被墙了,但根据百度的方法换了淘宝镜像和用了vpn都安装失败,最后发现原来是因为没有卸载之 ...
- Ubuntu Grub 配置跟新
自从上了Grub2,就开始装逼了,配置不如以前方便了. 需要修改一些基本的配置如菜单超时之类的可以修改/etc/default/grub文件,然后使用update-grub来更新/boot/grub/ ...
- Android 使用全局变量的问题
现在每天都在忙,而且一忙起来,就把写笔记的事情放在了后面,最近在写程序的时候,突然要使用全局变量,就按照以前的方式,写了一个类,然后把变量都声明为静态变量,然后做为全局变量使用,但是在进行Activi ...
- yii 修改模块使用的布局文件
方法一:yii模块默认使用系统当前的主题布局文件,如果在主配置文件中配置了主题比如: 'theme'=>'mythm', 那么yii的模块就使用 protected/themes/mythm/v ...
- 阿里云 CentOS7安装redis4.0.9并开启远程访问
1 安装redis编译的c环境 yum install gcc-c++ redis是c语言开发的,安装redis需要先将官网下载的源码进行编译,编译依赖gcc环境. 如果没有gcc环境,需要安装gcc ...