主要说一下微信小程序的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应用