微信小程序 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 相关文章推荐
js 中 document.createEvent的用法
Aug 29 Javascript
深入理解JavaScript系列(3) 全面解析Module模式
Jan 15 Javascript
Javascript 多浏览器兼容总结(实战经验)
Oct 30 Javascript
jquery div拖动效果示例代码
Dec 08 Javascript
JS实现自动固定顶部的悬浮菜单栏效果
Sep 16 Javascript
深入浅析JSON.parse()、JSON.stringify()和eval()的作用详解
Apr 03 Javascript
全面了解javascript三元运算符
Jun 27 Javascript
BOM系列第一篇之定时器setTimeout和setInterval
Aug 17 Javascript
详解windows下vue-cli及webpack 构建网站(二)导入bootstrap样式
Jun 17 Javascript
快速处理vue渲染前的显示问题
Mar 05 Javascript
详解JS函数stack size计算方法
Jun 18 Javascript
详解JavaScript函数callee、call、apply的区别
Mar 08 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与MySQL交互使用详解
2006/10/09 PHP
PHP静态文件生成类实例
2014/11/29 PHP
PHP中配置IIS7实现基本身份验证的方法
2015/09/24 PHP
thinkphp5框架前后端分离项目实现分页功能的方法分析
2019/10/08 PHP
JavaScript 特殊字符
2007/04/05 Javascript
javascript深入理解js闭包
2010/07/03 Javascript
jQuery调用WebService的实现代码
2011/06/19 Javascript
javascript利用控件对windows的操作实现原理与应用
2012/12/23 Javascript
jquery延迟加载外部js实现代码
2013/01/11 Javascript
jQuery删除节点的三个方法即remove()detach()和empty()
2013/12/27 Javascript
使用命令对象代替switch语句的写法示例
2015/02/28 Javascript
完美解决node.js中使用https请求报CERT_UNTRUSTED的问题
2017/01/08 Javascript
微信小程序 利用css实现遮罩效果实例详解
2017/01/21 Javascript
微信小程序getPhoneNumber获取用户手机号
2017/09/29 Javascript
Vue2.0 $set()的正确使用详解
2020/07/28 Javascript
vue-drawer-layout实现手势滑出菜单栏
2020/11/19 Vue.js
Python过滤函数filter()使用自定义函数过滤序列实例
2014/08/26 Python
Python中列表元素转为数字的方法分析
2016/06/14 Python
python打包exe开机自动启动的实例(windows)
2019/06/28 Python
Django框架静态文件使用/中间件/禁用ip功能实例详解
2019/07/22 Python
对Python _取log的几种方式小结
2019/07/25 Python
python实现大学人员管理系统
2019/10/25 Python
python读取与处理netcdf数据方式
2020/02/14 Python
python使用pandas抽样训练数据中某个类别实例
2020/02/28 Python
python上传时包含boundary时的解决方法
2020/04/08 Python
keras model.fit 解决validation_spilt=num 的问题
2020/06/19 Python
Python 爬虫的原理
2020/07/30 Python
canvas绘制表情包的示例代码
2018/07/09 HTML / CSS
美国五金商店:Ace Hardware
2018/03/27 全球购物
用C语言实现文件读写操作
2013/10/27 面试题
农民致富事迹材料
2014/01/23 职场文书
大队委竞选演讲稿
2014/04/28 职场文书
爱护公共设施演讲稿
2014/09/13 职场文书
群众路线领导班子四风对照检查材料
2014/09/27 职场文书
明星邀请函
2015/02/02 职场文书
2015年大学生社会实践评语
2015/03/26 职场文书