微信小程序 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 相关文章推荐
删除条目时弹出的确认对话框
Jun 05 Javascript
jquery实现右侧栏菜单选择操作
Mar 04 Javascript
浅谈window.onbeforeunload() 事件调用ajax
Jun 29 Javascript
Bootstrap的modal拖动效果
Dec 25 Javascript
移动端界面的适配
Jan 11 Javascript
bootstrap响应式表格实例详解
May 15 Javascript
bootstrap switch开关组件使用方法详解
Aug 22 Javascript
Vue登录注册并保持登录状态的方法
Aug 17 Javascript
Vue使用Proxy监听所有接口状态的方法实现
Jun 07 Javascript
node.js 使用 net 模块模拟 websocket 握手进行数据传递操作示例
Feb 11 Javascript
八种Vue组件间通讯方式合集(推荐)
Aug 18 Javascript
JS绘图Flot应用图形绘制异常解决方案
Oct 16 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/09/30 PHP
劣质的PHP代码简化
2010/02/08 PHP
使用 PHPMAILER 发送邮件实例应用
2012/11/07 PHP
php实现的任意进制互转类分享
2015/07/07 PHP
微信开发之php表单微信中自动提交两次问题解决办法
2017/01/08 PHP
PHP快速推送微信模板消息
2017/04/14 PHP
div移动 输入框不能输入的问题
2009/11/19 Javascript
基于jquery的滑动样例代码
2010/11/20 Javascript
JS判断当前日期是否大于某个日期的实现代码
2012/09/02 Javascript
使用AOP改善javascript代码
2015/05/01 Javascript
jqPlot jQuery绘图插件的使用
2016/06/18 Javascript
微信小程序 条件渲染详解
2016/10/09 Javascript
d3.js实现简单的网络拓扑图实例代码
2016/11/06 Javascript
微信小程序 label 组件详解及简单实例
2017/01/10 Javascript
js 性能优化之算法和流程控制
2017/02/15 Javascript
react.js 父子组件数据绑定实时通讯的示例代码
2017/09/25 Javascript
基于jQuery ztree实现表格风格的树状结构
2018/08/31 jQuery
小程序实现页面顶部选项卡效果
2018/11/06 Javascript
extjs4图表绘制之折线图实现方法分析
2020/03/06 Javascript
[01:28]国服启动器接入蒸汽平台操作流程视频
2021/03/11 DOTA
跟老齐学Python之眼花缭乱的运算符
2014/09/14 Python
python中Flask框架简单入门实例
2015/03/21 Python
Python中每次处理一个字符的5种方法
2015/05/21 Python
Python3 XML 获取雅虎天气的实现方法
2018/02/01 Python
python实现简单五子棋游戏
2019/06/18 Python
PyQt5-QDateEdit的简单使用操作
2020/07/12 Python
Python项目打包成二进制的方法
2020/12/30 Python
教师求职信范文分享
2013/12/27 职场文书
财务管理专业自荐书
2014/09/02 职场文书
群众路线教育实践活动总结
2014/10/30 职场文书
2015年银行工作总结范文
2015/04/01 职场文书
刑事撤诉申请书
2015/05/18 职场文书
总结一些Java常用的加密算法
2021/06/11 Java/Android
pytorch中的 .view()函数的用法介绍
2022/03/17 Python
云服务器部署 Web 项目的实现步骤
2022/06/28 Servers
TS 类型兼容教程示例详解
2022/09/23 Javascript