微信小程序 SocketIO 实例讲解


Posted in Javascript onOctober 13, 2016

微信小程序 ScoketIO 简单实例:

现在好的人在搞微信小程序,ScoketIO 是微信的网络通信,它的重要性不言而喻,这里给大家讲讲如何使用以及注意事项!

微信小程序 的SocketIO 实现,基于CFETram 的实现基础上完善

const emitter = require('./emitter.js');

/** socket.io 协议常量 */
var packets = {
  open:   0  // non-ws
 , close:  1  // non-ws
 , ping:   2
 , pong:   3
 , message: 4
 , upgrade: 5
 , noop:   6
};
var events = { 
  CONNECT: 0,
  DISCONNECT: 1,
  EVENT: 2,
  ACK: 3,
  ERROR: 4,
  BINARY_EVENT: 5,
  BINARY_ACK: 6
};

const PING_CHECK_INTERVAL = 2000;


class WxSocketIO {
  connect(url) {
    return new Promise((resolve, reject) => {
      wx.onSocketOpen((response) => {
        this.isConnected = true;
        //this.ping();
        resolve(response);
      });
      wx.onSocketError(error => {
        if (this.isConnected) {
          this.fire('error', error);
        } else {
          reject(error);
        }
      });
      wx.onSocketMessage(message => this._handleMessage(message));
      wx.onSocketClose(result => {
        if (this.isConnected) {
          this.fire('error', new Error("The websocket was closed by server"));
        } else {
          this.fire('close');
        }
        this.isConnected = false;
        this.destory();
      });
      wx.connectSocket({
        url: `${url}/?EIO=3&transport=websocket`
      });
    });
  }
  ping() {
    setTimeout(() => {
      if (!this.isConnected) return;
      wx.sendSocketMessage({
        data: [packets.ping, 'probe'].join('')
      });
    }, PING_CHECK_INTERVAL);
  }
  close() {
    return new Promise((resolve, reject) => {
      if (this.isConnected) {
        this.isConnected = false;
        wx.onSocketClose(resolve);
        wx.closeSocket();
      } else {
        reject(new Error('socket is not connected'));
      }
    });
  }
  emit(type, ...params) {
    const data = [type, ...params];
    wx.sendSocketMessage({
      data: [packets.message, events.EVENT, JSON.stringify(data)].join("")
    });
  }
  destory() {
    this.removeAllListeners();
  }
  _handleMessage({ data }) {
    const [match, packet, event, content] = /^(\d)(\d?)(.*)$/.exec(data);
    if (+event === events.EVENT) {
      switch (+packet) {
        case packets.message:
          let pack;
          try {
            pack = JSON.parse(content);
          } catch (error) {
            console.error('解析 ws 数据包失败:')
            console.error(error);
          }
          const [type, ...params] = pack;
          this.fire(type, ...params);
          break;
      }
    }
    else if (+packet == packets.pong) {
      this.ping();
    }
  }
};

emitter.setup(WxSocketIO.prototype);

module.exports = WxSocketIO;

DEMO

项目附了一个微信小程序的DEMO 项目演示了接入 Scoket.IO 官方的演示聊天室,以便方便测试,关于详细用法还请参考官方文档。

How  to use

const opts = {}
const socket = this.globalData.socket = new WxSocketIO()
socket.connect('ws://chat.socket.io', opts)
.then(_ => {
 console.info('App::WxSocketIO::onOpen')
 console.info('App:onShow:', that.globalData)
})
.catch(err => {
 console.error('App::WxSocketIO::onError', err)
})
其中socket.connect(ws_url, opts)中,opts目前可选值是path,用来指定使用socket.io时默认的path,比如设置opts为下列值:

{
 query: 'fanweixiao',
 with: 'mia&una',
}

完整实例地址:https://github.com/fanweixiao/wxapp-socket-io

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
event对象获取方法总结在google浏览器下测试
Nov 03 Javascript
浅谈Node.js中的定时器
Jun 18 Javascript
JavaScript事件 "事件对象"的注意要点
Jan 14 Javascript
JavaScript对象封装的简单实现方法(3种方法)
Jan 03 Javascript
微信小程序 引入es6 promise
Apr 12 Javascript
Vue shopCart 组件开发详解
Jan 26 Javascript
浅谈webpack 构建性能优化策略小结
Jun 13 Javascript
Vuejs开发环境搭建及热更新【推荐】
Sep 07 Javascript
详解JavaScript 新语法之Class 的私有属性与私有方法
Apr 23 Javascript
javascript触发模拟鼠标点击事件
Jun 26 Javascript
微信小程序indexOf的替换方法(推荐)
Jan 14 Javascript
js实现筛选功能
Nov 24 Javascript
简单谈谈JS数组中的indexOf方法
Oct 13 #Javascript
使用jquery如何获取时间
Oct 13 #Javascript
HTML Table 空白单元格补全的简单实现
Oct 13 #Javascript
微信js-sdk分享功能接口常用逻辑封装示例
Oct 13 #Javascript
js给table赋值的实例代码
Oct 13 #Javascript
js将table的每个td的内容自动赋值给其title属性的方法
Oct 13 #Javascript
jquery获取点击控件的绝对位置简单实例
Oct 13 #Javascript
You might like
无限级别菜单的实现
2006/10/09 PHP
PHP SQLite类
2009/05/07 PHP
PHP下通过file_get_contents的代理使用方法
2011/02/16 PHP
实例分析10个PHP常见安全问题
2019/07/09 PHP
JavaScript入门教程(8) Location地址对象
2009/01/31 Javascript
Firefox div高度自适应
2009/04/28 Javascript
Js数组的操作push,pop,shift,unshift等方法详细介绍
2012/12/28 Javascript
js实现支持手机滑动切换的轮播图片效果实例
2015/04/29 Javascript
javascript中this指向详解
2016/04/23 Javascript
微信JS接口大全
2016/08/25 Javascript
JavaScript实现拖拽元素对齐到网格(每次移动固定距离)
2016/11/30 Javascript
bootstrap模态框实现拖拽效果
2016/12/14 Javascript
JavaScript两个变量交换值的实现方法
2017/03/01 Javascript
超级简易的JS计算器实例讲解(实现加减乘除)
2017/08/08 Javascript
jquery实现倒计时小应用
2017/09/19 jQuery
BootStrap table实现表格行拖拽效果
2018/12/01 Javascript
微信小程序绑定手机号获取验证码功能
2019/10/22 Javascript
ant design实现圈选功能
2019/12/17 Javascript
详解vue v-model
2020/08/31 Javascript
[03:49]辉夜杯现场龙骑士COSER秀情商“我喜欢芬队!”
2015/12/27 DOTA
Python yield使用方法示例
2013/12/04 Python
Django框架中数据的连锁查询和限制返回数据的方法
2015/07/17 Python
python的else子句使用指南
2016/02/27 Python
Python基于回溯法子集树模板解决选排问题示例
2017/09/07 Python
wxPython多个窗口的基本结构
2019/11/19 Python
Django {{ MEDIA_URL }}无法显示图片的解决方式
2020/04/07 Python
python线程池如何使用
2020/05/28 Python
Python字典fromkeys()方法使用代码实例
2020/07/20 Python
HTML5制作3D爱心动画教程 献给女友浪漫的礼物
2014/11/05 HTML / CSS
真正的英国宝藏:Mappin & Webb
2019/05/05 全球购物
排序都有哪几种方法?请列举。用JAVA实现一个快速排序
2014/02/16 面试题
幼师自荐信
2013/10/26 职场文书
入党自传范文2015
2015/06/26 职场文书
联村联户简报
2015/07/21 职场文书
SQL Server中交叉联接的用法详解
2021/04/22 SQL Server
python 安全地删除列表元素的方法
2022/03/16 Python