微信小程序結(jié)合actioncable實(shí)現(xiàn)通信

參考資料
actioncable
微信小程序
在做微信小程序開發(fā)的時(shí)候需要用到websocket通信川队,由于小程序沒有對(duì)actioncable.js的封裝瞬矩,因此需要根據(jù)小程序的websocket接口文檔進(jìn)行傳遞參數(shù)的處理。
首先看一下使用actioncable.js模塊時(shí)的網(wǎng)絡(luò)數(shù)據(jù)傳輸情況

訂閱頻道

訂閱之后返回信息
發(fā)送消息

通過以上三張截圖可以很明確的看到actioncable.js所做的事情,把rails服務(wù)器端需要的數(shù)據(jù)進(jìn)行封裝盲赊,按照固定的格式進(jìn)行數(shù)據(jù)傳輸伸眶。
so惊窖!為了在小程序中實(shí)現(xiàn)同樣的功能,只需要按照這個(gè)格式對(duì)傳遞的參數(shù)進(jìn)行相應(yīng)的封裝即可厘贼。

創(chuàng)建服務(wù)器端代碼

rails g channel qagame # 創(chuàng)建channel

為了讓小程序可以訪問到服務(wù)器端的數(shù)據(jù)界酒,需要修改actioncable的配置
config/application.rb

# 添加action_cable配置,關(guān)閉跨域檢測(cè)
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 "獲取客戶端數(shù)據(jù):#{data}"
    ActionCable.server.broadcast("qagame_channel", "登錄成功") # 返回?cái)?shù)據(jù)到客戶端
  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: '這個(gè)是訂閱參數(shù)' });
    wx.onSocketOpen(function () {
      wx.sendSocketMessage({
        data: JSON.stringify({ command: "subscribe", identifier: id}),
      })
    })
    // 延時(shí)發(fā)送命令嘴秸,等待客戶端和服務(wù)器連接成功 
    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("連接已關(guān)閉")
      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服務(wù)器地址 http://localhost:3000/cable
   * channel  服務(wù)端channel名字如:GameChannel
   * id       可選參數(shù),
   * cb       接受返回?cái)?shù)據(jù)的回調(diào)函數(shù)
   */
  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) // 服務(wù)器端返回?cái)?shù)據(jù)
      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("連接已關(guān)閉")
      console.log(res)
    })
    wx.onSocketError(function (err) {
      console.log("打開連接失敗")
      console.log(err)
    })
  }

  /**
   * 發(fā)送消息
   *  action  channel中定義的action名字
   *  data    傳遞到action的數(shù)據(jù)
   */
  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
}

調(diào)用例子

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);

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末毁欣,一起剝皮案震驚了整個(gè)濱河市庇谆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌凭疮,老刑警劉巖饭耳,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異执解,居然都是意外死亡寞肖,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門衰腌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來新蟆,“玉大人,你說我怎么就攤上這事桶唐≌て希” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵尤泽,是天一觀的道長(zhǎng)欣簇。 經(jīng)常有香客問我,道長(zhǎng)坯约,這世上最難降的妖魔是什么熊咽? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮闹丐,結(jié)果婚禮上横殴,老公的妹妹穿的比我還像新娘。我一直安慰自己卿拴,他們只是感情好衫仑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著堕花,像睡著了一般文狱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上缘挽,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天瞄崇,我揣著相機(jī)與錄音,去河邊找鬼壕曼。 笑死苏研,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的腮郊。 我是一名探鬼主播摹蘑,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼伴榔!你這毒婦竟也來了纹蝴?” 一聲冷哼從身側(cè)響起庄萎,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤踪少,失蹤者是張志新(化名)和其女友劉穎塘安,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體援奢,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡兼犯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了集漾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片切黔。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖具篇,靈堂內(nèi)的尸體忽然破棺而出纬霞,到底是詐尸還是另有隱情,我是刑警寧澤驱显,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布诗芜,位于F島的核電站,受9級(jí)特大地震影響埃疫,放射性物質(zhì)發(fā)生泄漏伏恐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一栓霜、第九天 我趴在偏房一處隱蔽的房頂上張望翠桦。 院中可真熱鬧,春花似錦胳蛮、人聲如沸销凑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)斗幼。三九已至,卻和暖如春茂洒,著一層夾襖步出監(jiān)牢的瞬間孟岛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工督勺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留渠羞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓智哀,卻偏偏與公主長(zhǎng)得像次询,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瓷叫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容