新建ws.js
const app = getApp()
let intervalWS = "" //断线重连定时器
let socket=""
const webSocketInit= function(options) {
let socketUrl = `ws://127.0.0.1:3001/socketTest?id=ls`
// 建立 WebSocket 连接
socket = wx.connectSocket({
url: socketUrl,
header: {
'content-type': 'application/json',
'authorization': 'testaaa',
'x-wxapp-sockettype': 'ordertips',
},
success(res) {
console.log('WebSocket 连接成功: ', res)
},
fail(err) {
console.log('WebSocket 连接失败: ', err)
}
})
// onOpen
socket.onOpen(() => {
console.log('打开 WebSocket 连接')
})
// onError
socket.onError((err) => {
console.log('WebSocket 连接失败:', err)
})
// onClose
socket.onClose((ret) => {
console.log('断开 WebSocket 连接', ret)
})
//监听接收到的消息
socket.onMessage((res) => {
let msg = res.data
if (typeof msg === "string" && msg.startsWith("{")) {
msg = JSON.parse(msg)
}
console.log("接收到的服务器消息", msg)
})
if(!intervalWS){
ping()
}
app.globalData.socket=socket
}
//关闭socket连接
const closeSocket = function (socket) {
socket.close({
reason: "主动关闭",
complete: res=> {
console.log("关闭socket连接", res)
}
})
if(intervalWS) clearInterval(intervalWS)
}
// 发送消息
const send = function (socket,msg) {
socket.send({
data: typeof msg === "object" ? JSON.stringify(msg) : msg,
success(res) {
//console.log('WebSocket 消息发送成功', res)
},
fail(err) {
console.log('WebSocket 消息发送失败', err)
}
})
}
// 心跳,由客户端发起
const ping= function() {
let times = 0
// 每 10 秒钟由客户端发送一次心跳
intervalWS = setInterval(function () {
app.globalData.socket=socket
if (socket.readyState == 1) { //在线时发送心跳
send(socket,{
type: "ping",
detail: "ping"
})
} else if (socket.readyState == 3) {
times += 1
// 超时重连,最多尝试 10 次
console.log("重连次数",times)
if (times >= 10) {
wx.showToast({
title: 'WebSocket 连接已断开~',
icon: 'none',
duration: 2000
})
clearInterval(intervalWS)
}else{
webSocketInit()
}
}
}, 10000)
}
module.exports= {
webSocketInit,closeSocket,send
}
在小程序页面page.js引入
import {
webSocketInit,
closeSocket,
send
} from "../../utils/ws"
webSocketInit()
发送消息:
let msg = {
id: 1,
from: this.data.id,
to: "zs",
type: 'text',
time: formatTime(new Date()),
detail: "你好"
}
send(getApp().globalData.socket, msg)