微信小程序之WebSocket(附小程序和服務(wù)器源碼)

1赔退、前言


在看文章之前,首先提2個(gè)問題:

  • WebSocket 是什么原理创译?
  • 為什么可以實(shí)現(xiàn)持久連接残制?
    如果你不甚了解颗祝,請點(diǎn)擊傳送門

2、概述


websocket是一種全新的協(xié)議,不屬于http無狀態(tài)協(xié)議凤藏,協(xié)議名為"ws"欠雌,這意味著一個(gè)websocket連接地址會(huì)是這樣的寫法:ws://**禁炒。websocket協(xié)議本質(zhì)上是一個(gè)基于tcp的協(xié)議。

3涯捻、小程序具體實(shí)現(xiàn)

<!--index.wxml-->
<view class="container">
  <view bindtap="bindViewTap" class="userinfo">
    <image class="userinfo-avatar" src="{{userInfo.avatarUrl}}" background-size="cover"></image>
    <text class="userinfo-nickname">{{userInfo.nickName}}</text>
  </view>
  <view class="voice">
    <button type="primary" size="default" hover-class="button-hover" class="button-voice-play" bindtap="socketBtnTap">{{socktBtnTitle}}</button>
    <button type="primary" size="default" hover-class="button-hover" class="button-voice-play" bindtap="sendMessageBtnTap">發(fā)送</button>
  </view>
</view>
前端頁面

上面代碼中:
連接socket 按鈕綁定 socketBtnTap()
發(fā)送按鈕 綁定 sendMessageBtnTap()

<!--index.js-->
//獲取應(yīng)用實(shí)例
var app = getApp()
var socketOpen = false
var socketMsgQueue = []
Page({
  data: {
    userInfo: {},
    socktBtnTitle: '連接socket'
  },
  socketBtnTap: function () {
    var that = this
    var remindTitle = socketOpen ? '正在關(guān)閉' : '正在連接'
    wx.showToast({
      title: remindTitle,
      icon: 'loading',
      duration: 10000
    })
    if (!socketOpen) {
      //創(chuàng)建一個(gè) WebSocket 連接蝗拿;
      //一個(gè)微信小程序同時(shí)只能有一個(gè) WebSocket 連接,如果當(dāng)前已存在一個(gè) WebSocket 連接仓手,會(huì)自動(dòng)關(guān)閉該連接补履,并重新創(chuàng)建一個(gè) WebSocket 連接贬蛙。
      wx.connectSocket({
        url: 'ws://域名'
      })
      //監(jiān)聽WebSocket錯(cuò)誤
      wx.onSocketError(function (res) {
        socketOpen = false
        console.log('WebSocket連接打開失敗野蝇,請檢查!')
        that.setData({
          socktBtnTitle: '連接socket'
        })
        wx.hideToast()
      })
      //監(jiān)聽WebSocket連接打開事件。
      wx.onSocketOpen(function (res) {
        console.log('WebSocket連接已打開!')
        wx.hideToast()
        that.setData({
          socktBtnTitle: '斷開socket'
        })
        socketOpen = true
        for (var i = 0; i < socketMsgQueue.length; i++) {
          that.sendSocketMessage(socketMsgQueue[i])
        }
        socketMsgQueue = []
      })
      //監(jiān)聽WebSocket接受到服務(wù)器的消息事件
      wx.onSocketMessage(function (res) {
        console.log('收到服務(wù)器內(nèi)容:' + res.data)
      })
      //監(jiān)聽WebSocket關(guān)閉
      wx.onSocketClose(function (res) {
        socketOpen = false
        console.log('WebSocket 已關(guān)閉操漠!')
        wx.hideToast()
        that.setData({
          socktBtnTitle: '連接socket'
        })
      })
    } else {
      //關(guān)閉WebSocket連接长捧。
      wx.closeSocket()
    }
  },
  //事件處理函數(shù)
  bindViewTap: function () {
    wx.navigateTo({
      url: '../logs/logs'
    })
  },
  sendSocketMessage: function (msg) {
    if (socketOpen) {
      //通過 WebSocket 連接發(fā)送數(shù)據(jù)肌割,需要先 wx.connectSocket,并在 wx.onSocketOpen 回調(diào)之后才能發(fā)送。
      wx.sendSocketMessage({
        data: msg
      })
    } else {
      socketMsgQueue.push(msg)
    }
  },
  sendMessageBtnTap: function () {
    this.sendSocketMessage('小程序來了')
  },
  onLoad: function () {
    console.log('onLoad')
    var that = this
    //調(diào)用應(yīng)用實(shí)例的方法獲取全局?jǐn)?shù)據(jù)
    app.getUserInfo(function (userInfo) {
      //更新數(shù)據(jù)
      that.setData({
        userInfo: userInfo
      })
    })
  }
})

4剂邮、node.js服務(wù)器具體實(shí)現(xiàn)

node.js服務(wù)器的實(shí)現(xiàn)使用了ws

  • 安裝ws
    npm install --save ws
  • 使用
<!-- koa2_webSocket/bin/www.js -->

const webSocket = require('ws');
/**
 * Create WebSocket
 */
const wss = new webSocket.Server({server});

//const wss = new webSocket('wss://echo.websocket.org/', {
//  origin: 'https://websocket.org'
//});

//握手完成 ws是WebSocket的一個(gè)實(shí)例
wss.on('connection', function connection(ws) {
  console.log(ws.upgradeReq.url);
  //const location = url.parse(ws.upgradeReq.url, true);
  // You might use location.query.access_token to authenticate or share sessions
  // or ws.upgradeReq.headers.cookie (see http://stackoverflow.com/a/16395220/151312)
  
//發(fā)生錯(cuò)誤
  ws.on('error', function incoming(message) {
    console.log('error: %s', message);
  });

//斷開連接
  ws.on('close', function incoming(message) {
    console.log('close: %s', message);
  });

//收到消息
  ws.on('message', function incoming(message) {
    console.log('received: %s', message);
    ws.send('something123');
  });

//發(fā)送消息
  ws.send('something');
});

5、如何還不明白翼虫,怎么辦死陆?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末规哪,一起剝皮案震驚了整個(gè)濱河市均唉,隨后出現(xiàn)的幾起案子蚊逢,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件价涝,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)佩伤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門甸陌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疯汁,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵私爷,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么迹栓? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任惜姐,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布序仙。 她就那樣靜靜地躺著爬橡,像睡著了一般迁客。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天险掀,我揣著相機(jī)與錄音埠啃,去河邊找鬼潦牛。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼冈闭,長吁一口氣:“原來是場噩夢啊……” “哼耍休!你這毒婦竟也來了园匹?” 一聲冷哼從身側(cè)響起本昏,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡寿桨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年墨微,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了锈麸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翘魄。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡怀大,死狀恐怖蓖康,靈堂內(nèi)的尸體忽然破棺而出泳梆,到底是詐尸還是另有隱情套硼,我是刑警寧澤雾鬼,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜河劝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一缓呛、第九天 我趴在偏房一處隱蔽的房頂上張望票髓。 院中可真熱鬧怒详,春花似錦缎岗、人聲如沸拦盹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背喷面。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留盒齿,地道東北人叨咖。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像焰坪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子碧浊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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