WebSocket通信API

本文编辑: Flyinthesky Flyinthesky浏览 5345 版权所有,严禁转载

创建、断开WebSocket通信API

接口 说明
wx.connectSocket(OBJECT) 创建一个 WebSocket 连接。
wx.closeSocket() 关闭WebSocket连接。

监听WebSocket通信API

接口 说明
wx.onSocketOpen(CALLBACK) 监听WebSocket连接打开事件。
wx.onSocketError(CALLBACK) 监听WebSocket错误。
wx.onSocketMessage(CALLBACK) 监听WebSocket接受到服务器的消息事件。
wx.onSocketClose(CALLBACK) 监听WebSocket关闭。

发送数据API

接口 说明
wx.sendSocketMessage(OBJECT) 通过 WebSocket 连接发送数据,需要先 wx.connectSocket,并在wx.onSocketOpen回调之后才能发送。

主要方法

wx.connectSocket(OBJECT)
创建一个 WebSocket 连接;一个微信小程序同时只能有一个 WebSocket 连接,如果当前已存在一个 WebSocket 连接,会自动关闭该连接,并重新创建一个 WebSocket 连接。

参数 类型 必填 说明
url String 开发者服务器接口地址,必须是 wss 协议,且域名必须是后台配置的合法域名
data Object 请求的数据
header Object HTTP Header , header 中不能设置 Referer
method String 默认是GET,有效值为: OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
success Function 接口调用成功的回调函数
fail Function 接口调用失败的回调函数
complete Function 接口调用结束的回调函数(调用成功、失败都会执行)

示例代码:

wx.connectSocket({
  url: 'test.php',
  data:{
    x: '',
    y: ''
  },
  header:{ 
    'content-type': 'application/json'
  },
  method:"GET"
})

引申:WSS、SSL 和 https 之间的关系
SSL:
SSL(Secure Socket Layer,安全套接层) 简单来说是一种加密技术, 通过它, 我们可以在通信的双方上建立一个安全的通信链路, 因此数据交互的双方可以安全地通信, 而不需要担心数据被窃取。
WSS:
WSS 是 Web Socket Secure 的简称, 它是 WebSocket 的加密版本. 我们知道 WebSocket 中的数据是不加密的, 但是不加密的数据很容易被别有用心的人窃取, 因此为了保护数据安全, 人们将 WebSocket 与 SSL 结合, 实现了安全的 WebSocket 通信, 即 WebSocket Secure.所以说 WSS 是使用 SSL 进行加密了的 WebSocket 通信技术。
HTTPS:
其实 HTTPS 和 WSS 类似, HTTP 之于 HTTPS 就像 WebSocket 之于 WebSocket Secure.HTTP 协议本身也是明文传输, 因此为了数据的安全性, 人们利用 SSL 作为加密通道, 在 SSL 之上传递 HTTP 数据, 因此 SSL 加密通道上运行的 HTTP 协议就被称为 HTTPS 了。
总结:
SSL 是基础, 在 SSL 上运行 WebSocket 协议就是 WSS; 在 SSL 上运行 HTTP 协议就是 HTTPS。

wx.onSocketOpen(CALLBACK)
监听WebSocket连接打开事件。
示例代码:

wx.connectSocket({
  url: 'test.php'
})
wx.onSocketOpen(function(res) {
  console.log('WebSocket连接已打开!')
})

wx.onSocketError(CALLBACK)
监听WebSocket错误。
示例代码:

wx.connectSocket({
  url: 'test.php'
})
wx.onSocketOpen(function(res){
  console.log('WebSocket连接已打开!')
})
wx.onSocketError(function(res){
  console.log('WebSocket连接打开失败,请检查!')
})

wx.onSocketMessage(CALLBACK)
CALLBACK返回参数:

参数 类型 说明
data String/ArrayBuffer 服务器返回的消息

示例代码:

wx.connectSocket({
  url: 'test.php'
})

wx.onSocketMessage(function(res) {
  console.log('收到服务器内容:' + res.data)
})

wx.onSocketClose(CALLBACK)
监听WebSocket关闭。
示例代码:

wx.connectSocket({
  url: 'test.php'
})

//注意这里有时序问题,
//如果 wx.connectSocket 还没回调 wx.onSocketOpen,而先调用 wx.closeSocket,那么就做不到关闭 WebSocket 的目的。
//必须在 WebSocket 打开期间调用 wx.closeSocket 才能关闭。
wx.onSocketOpen(function() {
  wx.closeSocket()
})

wx.onSocketClose(function(res) {
  console.log('WebSocket 已关闭!')
})

wx.sendSocketMessage(OBJECT)
通过 WebSocket 连接发送数据,需要先 wx.connectSocket,并在 wx.onSocketOpen回调之后才能发送。

参数 类型 必填 说明
data Object 请求的数据
success Function 接口调用成功的回调函数
fail Function 接口调用失败的回调函数
complete Function 接口调用结束的回调函数(调用成功、失败都会执行)

示例代码:

var socketOpen = false
var socketMsgQueue = []
wx.connectSocket({
  url: 'test.php'
})

wx.onSocketOpen(function(res) {
  socketOpen = true
  for (var i = 0; i < socketMsgQueue.length; i++){
     sendSocketMessage(socketMsgQueue[i])
  }
  socketMsgQueue = []
})

function sendSocketMessage(msg) {
  if (socketOpen) {
    wx.sendSocketMessage({
      data:msg
    })
  } else {
     socketMsgQueue.push(msg)
  }
}

Bug & Tip

1、tip: createSocket 链接默认和最大超时时间都是 60s
2、tip: 网络请求的 referer 是不可以设置的,格式固定为 https://servicewechat.com/{appid}/{version}/page-frame.html,其中 {appid} 为小程序的 appid,{version} 为小程序的版本号,版本号为 0 表示为开发版。

如有技术问题或对本文有反馈,请加入QQ群:
微信小程序实战5营: 微信小程序Club实战5营