微信小程序结合actioncable实现通信

参考资料
actioncable
微信小程序
在做微信小程序开发的时候需要用到websocket通信,由于小程序没有对actioncable.js的封装,因此需要根据小程序的websocket接口文档进行传递参数的处理。
首先看一下使用actioncable.js模块时的网络数据传输情况

订阅频道

订阅之后返回信息
发送消息

通过以上三张截图可以很明确的看到actioncable.js所做的事情,把rails服务器端需要的数据进行封装,按照固定的格式进行数据传输。
so!为了在小程序中实现同样的功能,只需要按照这个格式对传递的参数进行相应的封装即可。

创建服务器端代码

rails g channel qagame # 创建channel

为了让小程序可以访问到服务器端的数据,需要修改actioncable的配置
config/application.rb

# 添加action_cable配置,关闭跨域检测
config.action_cable.disable_request_forgery_protection = true
class QagameChannel < ApplicationCable::Channel
  def subscribed
    stream_from "qagame_channel"
  end

  def unsubscribed
    # Any cleanup needed when channel is unsubscribed
  end

  def join_challenge(data)
    p "获取客户端数据:#{data}"
    ActionCable.server.broadcast("qagame_channel", "登录成功") # 返回数据到客户端
  end
end

客户端

const app = getApp()

Page({
  ...
  onLoad: function () {
    // test websocket
    wx.connectSocket({
      url: 'ws://localhost:3000/cable',
      header: {
        'content-type': 'application/json'
      },
      method: "GET"
    });
    const id = JSON.stringify({ channel: "QagameChannel", id: '这个是订阅参数' });
    wx.onSocketOpen(function () {
      wx.sendSocketMessage({
        data: JSON.stringify({ command: "subscribe", identifier: id}),
      })
    })
    // 延时发送命令,等待客户端和服务器连接成功 
    setTimeout(function(){
      wx.sendSocketMessage({
        data: JSON.stringify({
          command: 'message',
          data: JSON.stringify({ 
            openid: 123,
            action: 'join_challenge'
            }),
          identifier: id
        }),
      })
    }, 5000)
    wx.onSocketMessage(function(res){
      console.log(res);
    })
    wx.onSocketClose(function(res){
      console.log("连接已关闭")
      console.log(res)
    })
    wx.onSocketError(function(err){
      console.log("打开连接失败")
      console.log(err)
    })
  },
  ...
})

附上自己定义的Actioncable

const formatTime = date => {
  const year = date.getFullYear()
  const month = date.getMonth() + 1
  const day = date.getDate()
  const hour = date.getHours()
  const minute = date.getMinutes()
  const second = date.getSeconds()

  return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')
}

const formatNumber = n => {
  n = n.toString()
  return n[1] ? n : '0' + n
}

// 
class Actioncable {
  /**
   * url ws服务器地址 http://localhost:3000/cable
   * channel  服务端channel名字如:GameChannel
   * id       可选参数,
   * cb       接受返回数据的回调函数
   */
  constructor(url, channel, id, cb) {
    wx.connectSocket({
      url,
      header: {
        'content-type': 'application/json'
      },
      method: "GET"
    })
    this.identifier = JSON.stringify({ channel, id });
    wx.onSocketOpen(() => {
      wx.sendSocketMessage({
        data: JSON.stringify({ command: "subscribe", identifier: this.identifier }),
      })
    })
    wx.onSocketMessage((res) => {
      console.log(res) // 服务器端返回数据
      res = JSON.parse(res.data);
      if (JSON.stringify(res.identifier) == JSON.stringify(this.identifier)){
        if(res.message) {
          cb(res)
        }
      }
    })
    wx.onSocketClose(function (res) {
      console.log("连接已关闭")
      console.log(res)
    })
    wx.onSocketError(function (err) {
      console.log("打开连接失败")
      console.log(err)
    })
  }

  /**
   * 发送消息
   *  action  channel中定义的action名字
   *  data    传递到action的数据
   */
  sendMessage(action, data) {
    var info = {}
    data.action = action
    info.command = 'message'
    info.identifier = this.identifier
    info.data = JSON.stringify(data)
    wx.sendSocketMessage({
      data: JSON.stringify(info),
    })
  }
}

module.exports = {
  formatTime: formatTime,
  Actioncable
}

调用例子

const ws = new Actioncable('ws://localhost:3000/cable', 'QagameChannel', 1211, function(res){
      console.log(res);
    })
setTimeout(() => ws.sendMessage('join_challenge', { openid: 123, nick_name: 'Timer' }), 5000);

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358

推荐阅读更多精彩内容