微信小程序 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 22 Javascript
PHP中使用微秒计算脚本执行时间例子
Nov 19 Javascript
Javascript中的匿名函数与封装介绍
Mar 15 Javascript
jQuery+css3实现文字跟随鼠标的上下抖动
Jul 31 Javascript
基于jquery实现最简单的选项卡切换效果
May 08 Javascript
Angularjs实现带查找筛选功能的select下拉框示例代码
Oct 04 Javascript
详解js中Json的语法与格式
Nov 22 Javascript
Node.js连接Sql Server 2008及数据层封装详解
Aug 27 Javascript
javascript实现5秒倒计时并跳转功能
Jun 20 Javascript
微信小程序数据统计和错误统计的实现方法
Jun 26 Javascript
解决vue自定义全局消息框组件问题
Nov 22 Javascript
vue开发移动端底部导航条功能
Apr 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 中检查或过滤IP地址的实现代码
2011/11/27 PHP
php+redis消息队列实现抢购功能
2018/02/08 PHP
javascript 学习之旅 (3)
2009/02/05 Javascript
jquery1.4后 jqDrag 拖动 不可用
2010/02/06 Javascript
单击浏览器右上角的X关闭窗口弹出提示的小例子
2013/06/12 Javascript
Node.js和PHP根据ip获取地理位置的方法
2014/03/14 Javascript
纯JS实现本地图片预览的方法
2015/07/31 Javascript
基于JavaScript获取鼠标位置的各种方法
2015/12/16 Javascript
动态加载js文件简单示例
2016/04/21 Javascript
JS组件Bootstrap Table布局详解
2016/05/27 Javascript
完美解决node.js中使用https请求报CERT_UNTRUSTED的问题
2017/01/08 Javascript
AngularJS 使用ng-repeat报错 [ngRepeat:dupes]
2017/01/19 Javascript
vue组件间通信子与父详解(二)
2017/11/07 Javascript
详解react阻止无效重渲染的多种方式
2018/12/11 Javascript
JavaScript数组特性与实践应用深入详解
2018/12/30 Javascript
微信小程序城市选择及搜索功能的方法
2019/03/22 Javascript
javascript设计模式 ? 中介者模式原理与用法实例分析
2020/04/20 Javascript
vue中v-for循环选中点击的元素并对该元素添加样式操作
2020/07/17 Javascript
对于Python的Django框架使用的一些实用建议
2015/04/03 Python
python2与python3中关于对NaN类型数据的判断和转换方法
2018/10/30 Python
python2.7实现邮件发送功能
2018/12/12 Python
Python OpenCV实现鼠标画框效果
2020/08/19 Python
django创建最简单HTML页面跳转方法
2019/08/16 Python
Python semaphore evevt生产者消费者模型原理解析
2020/03/18 Python
jupyter notebook 增加kernel教程
2020/04/10 Python
Python实现淘宝秒杀功能的示例代码
2021/01/19 Python
CSS3属性box-shadow使用详细教程
2012/01/21 HTML / CSS
地球鞋加拿大官网:Earth Shoes Canada
2020/11/17 全球购物
信息部岗位职责
2013/11/12 职场文书
保洁主管岗位职责
2013/11/20 职场文书
经贸日语专业个人求职信范文
2014/04/29 职场文书
2014年教师节讲话稿5篇
2014/09/10 职场文书
行政助理岗位职责
2015/02/10 职场文书
家长会后的感想
2015/08/11 职场文书
html5中sharedWorker实现多页面通信的示例代码
2021/05/07 Javascript
Python+OpenCV实现图片中的圆形检测
2022/04/07 Python