微信小程序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的更多相关文章

  1. 微信小程序 WebSocket 使用非 443 端口连接

    前言 微信小程序支持使用 WebSocket 连接到服务器,准确地说是带 SSL 的 WebSocket,而微信小程序中不允许使用带端口的 wss 连接,只能使用 443 端口.想使用其他端口就需要在 ...

  2. 微信小程序-WebSocket

    wx.connectSocket(OBJECT) 创建一个 WebSocket 连接:一个微信小程序同时只能有一个 WebSocket 连接,如果当前已存在一个 WebSocket 连接,会自动关闭该 ...

  3. 微信小程序-WebSocket应用

    为何有 HTTP 协议还需要 WebSocket ? Http协议 有个缺陷:通信只能由客户端发起.举例来说,我们想了解今天的天气,只能是客户端向服务器发出请求,服务器返回查询结果.HTTP 协议做不 ...

  4. 快速上手微信小程序webSocket

    WebSocket是一种在单个TCP连接上进行全双工通信的协议.WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范.WebSocket API也被W3 ...

  5. 微信小程序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 ...

  6. 微信小程序(应用号)资源汇总整理

    微信小应用资源汇总整理 开源项目 WeApp - 微信小程序版的微信 wechat-weapp-redux-todos - 微信小程序集成Redux实现的Todo list wechat-weapp- ...

  7. 微信小程序(应用号)开发资源汇总整理 - 一直更新中

    开源项目 wechat-weapp-gank - 微信小程序版Gank客户端 wechat-dribbble - 微信小程序-Dribbble wechatApp-demo - 微信小程序 DEMO ...

  8. 黄聪:微信小程序(应用号)资源汇总整理(转)

    微信小应用资源汇总整理 开源项目 WeApp - 微信小程序版的微信 wechat-weapp-redux-todos - 微信小程序集成Redux实现的Todo list wechat-weapp- ...

  9. 微信小程序踩坑集合

    1:官方工具:https://mp.weixin.qq.com/debug/w ... tml?t=1476434678461 2:简易教程:https://mp.weixin.qq.com/debu ...

随机推荐

  1. docker-compose管理daocker

    Docker-compose管理docker服务 1.安装docker-compose @首先确保服务器上已经安装docker环境,如果没有安装使用如下命令进行安装: # yum  -y  insta ...

  2. button按钮被输入法顶起来,遮盖了input输入框

    在做手机端的表单提交的时候,在chrome浏览器调试的时候,忘记输入法会引起布局的问题.在webApp里input输入框,会自动调起输入法,但是输入法会改变浏览器的可视区域的大小.就是会把浏览器可视区 ...

  3. Hive学习之Locking

    众所周知,数据库必须要能够支持并发.无论在任何时候,允许同一时刻,多个用户能够同时读取或写入.没有必要给用户提供API显示的获取锁,所以所有的锁都是隐式获取的. 在Hive中有两种类型的锁: 共享锁S ...

  4. 【转】JavaScript代码性能优化总结

    本文作者:zifan 来自:携程设计委员会 链接:http://ued.ctrip.com/blog/javascript-code-performance-optimization-summary. ...

  5. FileStream文件的使用

    // FileStream//(操作字节的)水一勺一勺的 可以操作任意格式的文件           //File一下子就读出来 //读取文本文件 // FileMode.OpenOrCreate你针 ...

  6. [日常] crontab的秒执行和串行化和多进程实现

    1. crontab的最低运行频率是,按照每分钟执行一次,通过在脚本中简单实现按秒级别运行 比如这条cron规则 , 每分钟执行一次脚本 * * * * * php /var/www/html/tes ...

  7. springboot +element-axios跨域请求

    1.初始化element项目 1.1:vue init webpage '项目名称' 1.2:npm i element-ui -S 1.3:在main.js添加 import ElementUI f ...

  8. HDU 1428

    漫步校园 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  9. PL/SQL Developer 和 Instant Client客户端安装配置

    一. 准备工作 1. 点击此下载 PL/SQL Developer 2. 点击此下载 Instant Client 二. 配置Instant Client 1. 新建  %安装目录%\network\ ...

  10. 浅谈equals和==

    在java中equals和==都是用来作比较的,可是你知道他们之间有什么区别和联系吗? 首先,在Object类中,本质上equals和==都是一样的,如果查看源码,你会发现这里面equals的内部实现 ...