微信小程序 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 相关文章推荐
懒就要懒到底——鼠标自动点击(含时间判断)
Feb 20 Javascript
javascript 设计模式之单体模式 面向对象学习基础
Apr 18 Javascript
JavaScript的21条基本知识点
Mar 04 Javascript
使用 js+正则表达式为关键词添加链接
Nov 11 Javascript
javascript实现简单查找与替换的方法
Jul 22 Javascript
js实现的简单radio背景颜色选择器代码
Aug 18 Javascript
微信小程序 底部导航栏目开发资料
Dec 05 Javascript
详解jQuery简单的表格应用
Dec 16 Javascript
Windows下支持自动更新的Electron应用脚手架的方法
Dec 24 Javascript
JQueryDOM之样式操作
Mar 27 jQuery
vue-router源码之history类的浅析
May 21 Javascript
Node.JS在命令行中检查Chrome浏览器是否安装并打开指定网址
May 21 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
PHP 简单数组排序实现代码
2009/08/05 PHP
使用php完成常见的文件上传功能(推荐)
2017/01/13 PHP
JS字符串累加Array不一定比字符串累加快(根据电脑配置)
2012/05/14 Javascript
解决jquery submit()提交表单提示:f[s] is not a function
2013/01/23 Javascript
THREE.JS入门教程(1)THREE.JS使用前了解
2013/01/24 Javascript
jquery怎样实现ajax联动框(一)
2013/03/08 Javascript
Javascript之this关键字深入解析
2013/11/12 Javascript
jquery showModelDialog的使用方法示例详解
2013/11/19 Javascript
JavaScript设计模式之外观模式实例
2014/10/10 Javascript
js实现改进的仿蓝色论坛导航菜单效果代码
2015/09/06 Javascript
js数组如何添加json数据及js数组与json的区别
2015/10/27 Javascript
javascript超过容器后显示省略号效果的方法(兼容一行或者多行)
2016/07/14 Javascript
AngularJS教程之MVC体系结构详解
2016/08/16 Javascript
微信小程序进行微信支付的步骤昂述
2016/12/01 Javascript
浅析JS中的 map, filter, some, every, forEach, for in, for of 用法总结
2017/03/29 Javascript
利用js编写网页进度条效果
2017/10/08 Javascript
浅谈js获取ModelAndView值的问题
2018/03/28 Javascript
vue自定义filters过滤器
2018/04/26 Javascript
详解Angular操作cookies方法
2018/06/01 Javascript
JavaScript数组去重的几种方法
2019/04/07 Javascript
JavaScript实现移动端带transition动画的轮播效果
2020/03/24 Javascript
JS检测浏览器开发者工具是否打开的方法详解
2020/10/02 Javascript
[59:08]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第一局
2016/02/27 DOTA
Python环境下安装使用异步任务队列包Celery的基础教程
2016/05/07 Python
Python实现八皇后问题示例代码
2018/12/09 Python
python基于json文件实现的gearman任务自动重启代码实例
2019/08/13 Python
python将字母转化为数字实例方法
2019/10/04 Python
Django 解决开发自定义抛出异常的问题
2020/05/21 Python
python em算法的实现
2020/10/03 Python
Snapfish英国:在线照片打印和个性化照片礼品
2017/01/13 全球购物
人力管理专业毕业生求职信
2014/02/27 职场文书
仲裁协议书
2014/09/26 职场文书
授权收款委托书范本
2014/10/10 职场文书
涨价通知怎么写
2015/04/23 职场文书
js中Map和Set的用法及区别实例详解
2022/02/15 Javascript
mysql查看表结构的三种方法总结
2022/07/07 MySQL