主要說一下微信小程序的websocket
接口以及在小程序中的使用;php
webSocket
是什麼?微信的websocket
跟HTML5
的websocket
基本一致。都是HTTP
協議升級來的,作爲一個全新的Socket
在B/S
上使用,實現了服務器和瀏覽器的全雙工通訊
。html
Websocket
於 AJAX
的利弊在Websocket
出來以前,都是經過AJAX
來實現即時通訊
的。可是因爲AJAX是採用輪循的方式來實時獲取數據的,意思就是說在指定的時間間隔內,進行HTTP請求,而這種方式會產生一些弊端,一方面因爲發送的HTTP請求太多,容易佔用太多的帶寬,增長服務器的負荷;另外一方面,並非每一次的請求都會有數據變化,因此形成請求到結果的效率有時候會很低,(好比聊天室);web
而
Websocket
正好解決了這些弊端,它是在服務器和客戶端創建了一條通道,請求只是請求一次,並且能夠從通道中實時的獲取數據。
Websocket
協議Websocket
的鏈接不是以http
或 https
開頭的,二是以ws
或 wss
開頭的.json
實例: 實時顯示交易信息
這裏用到了圖表插件wxchart。canvas
添加stock頁面:小程序
將wxchart.js
放入到pages/stock/
中。微信小程序
socket.wxml瀏覽器
<!--pages/socket/socket.wxml--> <view class='title'> <text>實時交易信息</text> </view> <canvas style='width:100%;height: 200px;border: 1px solid #ccc;' canvas-id='lineCanvas'></canvas>
socket.js服務器
// pages/stock/stock.js //加載插件 var wxCharts = require('wxcharts.js'); Page({ data: {}, onLoad: function (options) { //創建鏈接 wx.connectSocket({ url: "ws://localhost:12345", }) //鏈接成功 wx.onSocketOpen(function() { wx.sendSocketMessage({ data: 'stock', }) }) //接收數據 wx.onSocketMessage(function(data) { var objData = JSON.parse(data.data); console.log(data); new wxCharts({ canvasId: 'lineCanvas',//指定canvas的id animation: false, type: 'line',//類型是線形圖 categories: ['2012', '2013', '2014', '2015', '2016', '2017'], series: [{ name: '交易量', data: objData,//websocket接收到的數據 format: function (val) { if (typeof val == "string") { val = parseFloat(val); } return val.toFixed(2) + '萬元'; } }, ], yAxis: { title: '交易金額 (萬元)', format: function (val) { return val.toFixed(2); }, min: 0 }, width: 320, height: 200 }); }) //鏈接失敗 wx.onSocketError(function() { console.log('websocket鏈接失敗!'); }) }, })
這裏WebSocket的地址是ws://localhost,端口是12345,鏈接成功後,向服務器發送stock,而後服務器向小程序提供數據信息。
附帶一個PHP代碼:微信
<?php include 'WebSocket.php'; class WebSocket2 extends WebSocket{ public function run(){ while(true){ $socketArr = $this->sockets; $write = NULL; $except = NULL; socket_select($socketArr, $write, $except, NULL); foreach ($socketArr as $socket){ if ($socket == $this->master){ $client = socket_accept($this->master); if ($client < 0){ $this->log("socket_accept() failed"); continue; }else{ $this->connect($client); } } else{ $this->log("----------New Frame Start-------"); $bytes = @socket_recv($socket,$buffer,2048,0); if ($bytes == 0){ $this->disconnect($socket); }else{ $user = $this->getUserBySocket($socket); if (!$user->handshake){ $this->doHandShake($user, $buffer); }else{ $buffer = $this->unwrap($user->socket, $buffer); //請求爲stock時,向通道內推送數據 if ($buffer == 'stock') { $arr = array(); //模擬數據 for ($i=0; $i < 6; $i++) { $arr[] = rand(1, 100) / 100; } $this->send($user->socket, json_encode($arr)); } } } } } } } } $s = new WebSocket2('localhost', 12345); $s -> run();
參考 微信小程序入門六: WebSocket應用