首页 > 微信应用  > 

原生WebSokcet实现断线重连及数据拼接实现方法

原生WebSokcet实现断线重连及数据拼接实现方法
WebSocket protocol 是HTML5一种新的协议。它实现了浏览器与服务器全双工通信(full-duplex)。本文主要和大家分享微信小程序使用原生WebSokcet实现断线重连及数据拼接,希望能帮助到大家。

websocket protocol 是html5一种新的协议。它实现了浏览器与服务器全双工通信(full-duplex)。本文主要和大家分享微信小程序使用原生websokcet实现断线重连及数据拼接,希望能帮助到大家。

一、说明

1.小程序原生的WebSokcet没有断线重连机制,这个是他的不足之处。

2.小程序新的版本库已经支持存在多个 WebSokcet 连接。

官方说明:基础库 1.7.0 之前,一个微信小程序同时只能有一个 WebSocket 连接,如果当前已存在一个 WebSocket 连接,会自动关闭该连接,并重新创建一个 WebSocket 连接。基础库版本 1.7.0 及以后,支持存在多个 WebSokcet 连接,每次成功调用 wx.connectSocket 会返回一个新的 SocketTask。

官方文档地址:https://mp.weixin.qq.com/debug/wxadoc/dev/api/network-socket.html#wxclosesocket

二、实际例子:

首先你需要socket地址url: let url = 'wss://http://xxx.xxx.com/?xxx=xxx'

注意:1.小程序管理后台添加socket域名的时候不能出现端口;2.如果使用了appID,协议必须是 wss;3.socket服务端映射的端口仅支持 80 和 443,和公众号一个尿性。

接下来放例子:

1、socket.js

const app = getApp();let url = &#39;wss://xxx.xxx.com/?xxx=xxx&#39;export const connect = function (cb) { // 定义一个方法 wx.connectSocket({ // 创建一个 WebSocket 连接 url: url, fail (err) {if (err) { console.log(&#39;%cWebSocket连接失败&#39;, &#39;color:red&#39;, err) app.globalData.socketConnectFail = true // 定义一个全局变量,当链接失败时改变变量的值}}}) wx.onSocketOpen(function (res) { // 监听WebSocket连接打开事件。 console.log(&#39;WebSocket打开成功&#39;); wx.sendSocketMessage({ // 通过 WebSocket 连接发送数据,需要先 wx.connectSocket,并在 wx.onSocketOpen 回调之后才能发送。 data: String2Base64(), // 用于订阅的参数,视具体情况而定 success (data) { console.log(&#39;WebSocket发送消息:&#39;, data.errMsg)}, fail (err) { console.log(&#39;Err&#39;, err)}})}) wx.onSocketMessage(function (res) { // 监听WebSocket接受到服务器的消息事件。 console.log(&#39;WebSocket接收到消息:&#39;, ArryBuffer2Json(res.data)); cb(ArryBuffer2Json(res.data)); // 将接收到的消息进行回调,如果是ArryBuffer,需要进行转换}) wx.onSocketError(function (res) { // 监听WebSocket错误。 console.log(&#39;WebSocket连接打开失败&#39;)}) wx.onSocketClose(function (res) { // 监听WebSocket关闭。 console.log(&#39;WebSocket关闭&#39;);})};function ArryBuffer2Json (data) { // ArryBuffer转换成Jsontry {var encodedString = String.fromCharCode.apply(null, new Uint8Array(data));var decodedString = decodeURIComponent(atob(encodedString));return JSON.parse(decodedString);} catch (err) { console.log(err);return false;}}function String2Base64 () { // 用于订阅的参数,视具体情况而定var packet = {}; packet["cmd"] = "subscribe"; packet["reqNo"] = "" + new Date().getTime(); packet["params"] = {token: token, channelId: &#39;xcx&#39;, columnIds: "1"};return stringToUint(JSON.stringify(packet))}function stringToUint (string) {var string = base64_encode(encodeURIComponent(string)), charList = string.split(&#39;&#39;), uintArray = [];for (var i = 0; i < charList.length; i++) { uintArray.push(charList[i].charCodeAt(0));}return new Uint8Array(uintArray);}function base64_encode (str) { // base64转码var c1, c2, c3;var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var i = 0, len = str.length, string = &#39;&#39;;while (i < len) { c1 = str.charCodeAt(i++) & 0xff;if (i == len) {string += base64EncodeChars.charAt(c1 >> 2);string += base64EncodeChars.charAt((c1 & 0x3) << 4);string += "==";break;} c2 = str.charCodeAt(i++);if (i == len) {string += base64EncodeChars.charAt(c1 >> 2);string += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));string += base64EncodeChars.charAt((c2 & 0xF) << 2);string += "=";break;} c3 = str.charCodeAt(i++);string += base64EncodeChars.charAt(c1 >> 2);string += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));string += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6));string += base64EncodeChars.charAt(c3 & 0x3F)}return string}

原生WebSokcet实现断线重连及数据拼接实现方法由讯客互联微信应用栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“原生WebSokcet实现断线重连及数据拼接实现方法