Websocket使用(uniapp)

2,425 阅读2分钟

Websocket使用——以uniapp为例

实现app的websocket初始化,心跳发送消息,断线重连
使用uniapp提供的方法,js代码实现如下
特别注意,参数需要使用encodeURIComponent转码一下,不然ios会有onOpen监听不到的情况原因是token可能有空格,没有处理。直接拼在url上,然后Android,H5都可以识别,就苹果底层估计直接给拦截掉了

const WsUrl = "ws://127.0.0.1:8001"
export var socket = null
export function StartWebsocket(token = uni.getStorageSync('token')) {
    return new Promise((resolve, reject) => {
        if (!socket && token) {
            socket = uni.connectSocket({
                url: WsUrl + '?token=' + encodeURIComponent(token),
                complete: () => { }
            });
            socket.onOpen((res) => {
                handleSocketOpen()
                resolve(1)
            })
            socket.onError((error) => {
                handleSocketError(error)
                resolve(1)
            })
            socket.onClose((res) => {
                handleSocketClose()
                resolve(1)
            })
            socket.onMessage((res) => {
                console.log('收到服务器内容:' + res);
            })
        } else {
            resolve(1)
        }
    })
    // uni.onSocketOpen(function (res) {
    // 	handleSocketOpen()
    // });
    // uni.onSocketError(function (error) {
    // 	handleSocketError(error)
    // });
    // uni.onSocketClose(function (res) {
    // 	handleSocketClose()
    // 	console.log('WebSocket 已关闭!');
    // });
    // uni.onSocketMessage(function (res) {
    // 	getMessage(res)
    // });
}
// 监听WebSocket连接打开事件
function handleSocketOpen() {
    console.log('WebSocket连接已打开');
    startHeartbeat(); // 连接成功后开启心跳定时器
}
// 开启心跳定时器
let heartbeatTimer = null; // 心跳定时器
function startHeartbeat() {
    heartbeatTimer = setInterval(() => {
        sendHeartbeat();
    }, 3000); // 每3秒发送一次心跳消息
}
// 发送心跳消息
function sendHeartbeat() {
    uni.sendSocketMessage({
        data: "heartbeat"
    });
}
//关闭websocket
export function CloseWebsocket() {
    console.log("关闭websocket");
    if (socket) {
        socket.close();
    }
}
// 监听WebSocket连接关闭事件
function handleSocketClose() {
    console.log('WebSocket连接已关闭');
    socket = null
    clearInterval(heartbeatTimer); // 连接关闭时清除心跳定时器
}
// 监听WebSocket连接错误事件
function handleSocketError(error) {
    console.log('WebSocket连接出错');
    if (socket) {
        socket.close();
        socket = null
        clearInterval(heartbeatTimer);
    }
    setTimeout(() => {
        console.log("WebSocket尝试重新连接");
        StartWebsocket();
    }, 3000);
}

使用原生的方法,原生方法app无法使用,js代码实现如下

const WsUrl = "ws://127.0.0.1:8001"
export var socket = null
export function StartWebsocket(token = uni.getStorageSync('token')) {
    return new Promise((resolve, reject) => {
        if (!socket && token) {
            socket = new WebSocket(WsUrl)
            socket.addEventListener('open', handleSocketOpen);
            socket.addEventListener('message', handleSocketMessage);
            socket.addEventListener('close', handleSocketClose);
            socket.addEventListener('error', handleSocketError);
        } else {
            resolve(1)
        }
    })
}
// 监听WebSocket连接打开事件
function handleSocketOpen() {
    console.log('WebSocket连接已打开');
    startHeartbeat(); // 连接成功后开启心跳定时器
}
// 开启心跳定时器
let heartbeatTimer = null; // 心跳定时器
function startHeartbeat() {
    heartbeatTimer = setInterval(() => {
        sendHeartbeat();
    }, 3000); // 每3秒发送一次心跳消息
}
// 发送心跳消息
function sendHeartbeat() {
    socket.send({
        data: "heartbeat"
    });
}
// 监听WebSocket消息接收事件
function handleSocketMessage(event) {
    console.log("收到消息",event);
}
//关闭websocket
export function CloseWebsocket() {
    console.log("关闭websocket");
    if (socket) {
        socket.close();
    }
}
// 监听WebSocket连接关闭事件
function handleSocketClose() {
    console.log('WebSocket连接已关闭');
    socket = null
    clearInterval(heartbeatTimer); // 连接关闭时清除心跳定时器
}
// 监听WebSocket连接错误事件
function handleSocketError(error) {
    console.log('WebSocket连接出错');
    if (socket) {
        socket.close();
        socket = null
        clearInterval(heartbeatTimer);
    }
    setTimeout(() => {
        console.log("WebSocket尝试重新连接");
        StartWebsocket();
    }, 3000);
}

使用方法

<script setup>
import {
	onShow,
	onHide
} from '@dcloudio/uni-app'
import { StartWebsocket, CloseWebsocket } from './websocket'
onShow(() => {
	StartWebsocket()
})
onHide(() => {
	console.log('App Hide')
	CloseWebsocket()
})
</script>