uniapp在APP上如何使用websocket--詳解

UniApp 在 APP 端如何使用 WebSocket以及常見問題

一、WebSocket 基礎概念

WebSocket 是一種在單個TCP連接上進行全雙工通信的協議,適用于實時數據傳輸場景(如聊天室、實時游戲、股票行情等)。

與傳統HTTP對比

特性WebSocketHTTP
連接方式長連接短連接
通信方向全雙工半雙工
數據格式二進制/文本文本
首部大小2-10字節8000+字節

二、UniApp 中使用 WebSocket

1. API 概覽

UniApp 封裝了微信小程序風格的 WebSocket API:

  • uni.connectSocket() - 創建連接
  • uni.onSocketOpen() - 監聽連接打開
  • uni.onSocketError() - 監聽錯誤
  • uni.sendSocketMessage() - 發送消息
  • uni.onSocketMessage() - 接收消息
  • uni.closeSocket() - 關閉連接
  • uni.onSocketClose() - 監聽關閉

2. 完整使用示例

// websocket.js
let socketTask = null;
let reconnectAttempts = 0;
const maxReconnectAttempts = 5;export function connectWebSocket() {return new Promise((resolve, reject) => {const url = 'wss://your-websocket-server.com';// 創建連接socketTask = uni.connectSocket({url: url,success: () => {console.log('WebSocket 連接創建中...');},fail: (err) => {console.error('連接創建失敗:', err);reject(err);}});// 監聽打開事件socketTask.onOpen((res) => {console.log('WebSocket 連接已打開');reconnectAttempts = 0;resolve(socketTask);});// 監聽錯誤事件socketTask.onError((err) => {console.error('WebSocket 錯誤:', err);handleReconnection();reject(err);});// 監聽關閉事件socketTask.onClose((res) => {console.log('WebSocket 連接已關閉', res);if (!res.code === 1000) { // 非正常關閉handleReconnection();}});});
}function handleReconnection() {if (reconnectAttempts < maxReconnectAttempts) {reconnectAttempts++;const delay = Math.min(1000 * reconnectAttempts, 5000);console.log(`嘗試第 ${reconnectAttempts} 次重連,${delay}ms后執行`);setTimeout(() => {connectWebSocket().catch(console.error);}, delay);} else {console.error(`已達到最大重連次數 ${maxReconnectAttempts}`);}
}// 發送消息
export function sendWebSocketMessage(message) {return new Promise((resolve, reject) => {if (!socketTask || socketTask.readyState !== 1) {reject('WebSocket 未連接');return;}socketTask.send({data: JSON.stringify(message),success: () => resolve(),fail: (err) => reject(err)});});
}// 關閉連接
export function closeWebSocket() {if (socketTask) {socketTask.close({code: 1000,reason: '用戶主動關閉'});}
}

3. 心跳機制實現

let heartbeatTimer = null;function startHeartbeat() {// 每30秒發送一次心跳heartbeatTimer = setInterval(() => {sendWebSocketMessage({type: 'heartbeat',timestamp: Date.now()}).catch(() => {clearInterval(heartbeatTimer);});}, 30000);
}// 在onOpen中調用
socketTask.onOpen(() => {startHeartbeat();
});// 在onClose中清除
socketTask.onClose(() => {clearInterval(heartbeatTimer);
});

4. 消息隊列處理

當網絡不穩定時,可實現消息隊列:

let messageQueue = [];
let isSending = false;async function processQueue() {if (isSending || messageQueue.length === 0) return;isSending = true;const message = messageQueue.shift();try {await sendWebSocketMessage(message);} catch (err) {messageQueue.unshift(message); // 重新放回隊列} finally {isSending = false;processQueue();}
}export function queueMessage(message) {messageQueue.push(message);processQueue();
}

三、注意事項

  1. 平臺差異

    • iOS 對后臺WebSocket連接限制嚴格
    • 部分安卓機型可能在鎖屏后斷開連接
  2. 安全要求

    • 必須使用wss協議(SSL加密)
    • 建議實現消息加密(如AES)
  3. 性能優化

    • 大數據量傳輸建議使用ArrayBuffer
    • 避免頻繁發送小消息(可合并發送)
  4. 調試技巧

    // 開啟調試模式
    uni.setEnableDebug({enableDebug: true
    });
    

四、完整頁面示例

<template><view class="container"><button @click="connect">連接WebSocket</button><button @click="send">發送測試消息</button><button @click="close">關閉連接</button><scroll-view scroll-y class="message-box"><view v-for="(msg, index) in messages" :key="index">{{ msg }}</view></scroll-view></view>
</template><script>
import { connectWebSocket, sendWebSocketMessage, closeWebSocket } from '@/utils/websocket';export default {data() {return {messages: [],socketTask: null}},onUnload() {closeWebSocket();},methods: {async connect() {try {this.socketTask = await connectWebSocket();this.socketTask.onMessage((res) => {this.messages.push('收到消息: ' + res.data);});this.messages.push('WebSocket 已連接');} catch (err) {this.messages.push('連接失敗: ' + err);}},async send() {try {await sendWebSocketMessage({type: 'test',content: 'Hello WebSocket',timestamp: Date.now()});this.messages.push('消息已發送');} catch (err) {this.messages.push('發送失敗: ' + err);}},close() {closeWebSocket();this.messages.push('已主動關閉連接');}}
}
</script><style>
.container {padding: 20px;
}
.message-box {height: 300px;margin-top: 20px;border: 1px solid #eee;padding: 10px;
}
</style>

五、常見問題解決

Q1: 安卓設備連接不穩定

  • 解決方案:在manifest.json中配置:

    "app-plus": {"keepRunning": true,"optimization": {"keepAlive": true}
    }
    

Q2: iOS后臺斷連

  • 解決方案:啟用后臺模式(需在manifest.json中聲明):

    "ios": {"UIBackgroundModes": ["audio"]
    }
    

    并通過心跳保持活躍

Q3: 真機調試無法連接

  • 檢查項:
    1. 是否使用HTTPS/WSS
    2. 域名是否加入白名單
    3. 手機網絡是否正常

Q4: 如何發送二進制數據

// 發送ArrayBuffer
const buffer = new ArrayBuffer(8);
socketTask.send({data: buffer,fail: console.error
});

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/81549.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/81549.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/81549.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

物聯網賦能7×24H無人值守共享自習室系統設計與實踐!

隨著"全民學習"浪潮的興起&#xff0c;共享自習室市場也欣欣向榮&#xff0c;今天就帶大家了解下在物聯網的加持下&#xff0c;無人共享自習室系統的設計與實際方法。 一、物聯網系統整體架構 1.1 系統分層設計 層級技術組成核心功能用戶端微信小程序/H5預約選座、…

【Linux】ELF與動靜態庫的“暗黑兵法”:程序是如何跑起來的?

目錄 一、什么是庫&#xff1f; 1. C標準庫&#xff08;libc&#xff09; 2. C標準庫&#xff08;libstdc&#xff09; 二、靜態庫 1. 靜態庫的生成 2. 靜態庫的使用 三、動態庫 1. 動態庫的生成 2. 動態庫的使用 3. 庫運行的搜索路徑。 &#xff08;1&#xff09;原因…

滲透測試流程-中篇

#作者&#xff1a;允砸兒 #日期&#xff1a;乙巳青蛇年 四月廿一&#xff08;2025年5月18日&#xff09; 今天筆者帶大家繼續學習&#xff0c;網安的知識比較雜且知識面很廣&#xff0c;這一部分會介紹很多需要使用的工具。會用各種工具是做網安的基礎&#xff0c;ok咱們繼續…

[創業之路-358]:從歷史輪回到制度躍遷:中國共產黨創業模式的超越性密碼

人類文明的演進如同一條螺旋上升的階梯&#xff0c;從原始社會的公有制到資本主義私有制的巔峰&#xff0c;再到社會主義對公有制的重構&#xff0c;每一次制度迭代都伴隨著對前序文明的揚棄。中國共產黨自誕生之日起&#xff0c;便以“為人類求解放”為使命&#xff0c;在革命…

NLP基礎

目錄 一、NLP 概述和應用 &#xff08;一&#xff09;NLP 的定義與演進歷程 &#xff08;二&#xff09;NLP 的多元應用領域 二、文本預處理技術 &#xff08;一&#xff09;文本獲取與編碼轉換 &#xff08;二&#xff09;文本清洗&#xff1a;去除雜質的精細打磨 &…

【數據結構與算法】ArrayList 與順序表的實現

目錄 一、List 接口 1.1 List 接口的簡單介紹 1.1 常用方法 二、順序表 2.1 線性表的介紹 2.2 順序表的介紹 2.3 順序表的實現 2.3.1 前置條件:自定義異常 2.3.2 順序表的初始化 2.3.2 順序表的實現 三、ArrayList 實現類 3.1 ArrayList 的兩種使用方式 3.2 Array…

Linux518 YUM源倉庫回顧(需查)ssh 服務配置回顧 特定任務配置回顧

計劃配倉庫YUM源 為什么我在/soft文件夾下 使用yum install --downloadonly --downloaddir /soft samba 為什么文件夾下看不到samba文件 exiting because “Download Only” specified 計劃過 計劃配SSH 參考 ok了 計劃配置特定任務解決方案 code: 兩端先配好網絡 測試好s…

如何完美安裝GPU版本的torch、torchvision----解決torch安裝慢 無法安裝 需要翻墻安裝 安裝的是GPU版本但無法使用的GPU的錯誤

聲明&#xff1a; 本視頻靈感來自b站 如何解決所述問題 如何安裝對應版本的torch、torchvison 進入pytorch官網 進入歷史版本 這里以cuda11.8 torch 2.1.0為例演示 根據文檔找到要安裝的torch、torchvison版本 但不是使用命令行直接安裝 命令行直接安裝可能面臨著 安裝慢…

【iOS(swift)筆記-9】WKWebView無法訪問網絡

對于iOS 在info中添加App Transport Security Settings&#xff0c;然后在App Transport Security Settings里添加Allow Arbitrary Loadstrue 對于macOS 除了上面的操作&#xff0c;還需在項目信息的App Sandbox里有個Network打鉤選項

buck變換器的simulink/matlab仿真和python參數設計

什么是Buck電路? BUCK電路是一種降壓斬波器&#xff0c;降壓變換器輸出電壓平均值Uo總是小于輸出電壓UD。通常電感中的電流是否連續&#xff0c;取決于開關頻率、濾波電感L和電容C的數值。BUCK也是DC-DC基本拓撲&#xff0c;或者稱為電路結構&#xff0c;是最基本的DC-DC電路…

給個人程序加上MCP翅膀

背景 最近MCP這個詞真是到處都是&#xff0c;看起來特別高大上。我平時沒事的時候也一直在關注這方面的技術&#xff0c;知道它是怎么一回事&#xff0c;也懂該怎么去實現。但可惜一直抽不出時間來自己動手搞一個MCP服務。網上關于MCP的教程一搜一大把&#xff0c;但基本上都是…

AWS中國區CloudFront證書管理和應用指南

在AWS中國區使用CloudFront時,SSL/TLS證書的管理和應用是一個重要的環節。本文將詳細介紹如何在AWS中國區上傳、管理和應用SSL證書到CloudFront分配。 1. 準備證書文件 首先,我們需要準備好SSL證書相關的文件。通常,這包括: 私鑰文件(.key)公鑰證書文件(.crt)證書鏈文…

為什么hadoop不用Java的序列化?

Java的序列化是一個重量級序列化框架&#xff08;Serializable&#xff09;&#xff0c;一個對象被序列化后&#xff0c;會附帶很多額外的信息&#xff08;各種校驗信息&#xff0c;Header&#xff0c;繼承體系等&#xff09;&#xff0c;不便于在網絡中高效傳輸。所以&#xf…

Word壓縮解決方案

Word壓縮解決方案&#xff1a;基于圖片壓縮的 .docx 優化實踐 &#x1f4cc; 背景 在日常科研寫作或項目文檔整理中&#xff0c;Word 文檔&#xff08;.docx&#xff09;往往因為插入大量高清圖表、掃描圖像、公式圖等導致文件體積過大&#xff0c;或者畢業學位論文查重要求上…

基于基金凈值百分位的交易策略

策略來源&#xff1a;睿思量化小程序 基金凈值百分位&#xff0c;是衡量當前基金凈值在過去一段時間內的相對位置。以近一年為例&#xff0c;若某基金凈值百分位為30%&#xff0c;意味著過去一年中有30%的時間基金凈值低于當前值&#xff0c;70%的時間高于當前值。這一指標猶如…

數字人技術的核心:AI與動作捕捉的雙引擎驅動(210)

**摘要&#xff1a;**數字人技術從靜態建模邁向動態交互&#xff0c;AI與動作捕捉技術的深度融合推動其智能化發展。盡管面臨表情僵硬、動作脫節、交互機械等技術瓶頸&#xff0c;但通過多模態融合技術、輕量化動捕方案等創新&#xff0c;數字人正逐步實現自然交互與情感表達。…

基于OpenCV的實時文檔掃描與矯正技術

文章目錄 引言一、系統概述二、核心代碼解析1. 導入必要庫2. 輔助函數定義3. 坐標點排序函數4. 透視變換函數5. 主程序流程 三、完整代碼四、結語 引言 在日常工作和學習中&#xff0c;我們經常需要將紙質文檔數字化。手動拍攝文檔照片常常會出現角度傾斜、透視變形等問題&…

jenkins pipeline實現CI/CD

在企業級的架構中&#xff0c;CI/CD是必不可少的一個環節&#xff0c;它可以讓開發人員只關注于開發&#xff0c;而不必去關注項目的構建和部署&#xff0c;從而提高開發人員的效率。 本文我們來介紹一下使用jenkins 的pipeline來進行java項目的自動構建以及部署。我們通過腳本…

InfluxDB 3 Core + Java 11 + Spring Boot:打造高效物聯網數據平臺

一、 引言&#xff1a;為什么選擇InfluxDB 3&#xff1f; 項目背景&#xff1a; 在我們的隧道風機監控系統中&#xff0c;實時數據的采集、存儲和高效查詢是至關重要的核心需求。風機運行產生的振動、傾角、電流、溫度等參數是典型的時序數據&#xff0c;具有高并發寫入、數據…

泰國SAP ERP實施如何應對挑戰?工博科技賦能中企出海EEC戰略

泰國正依托"東部經濟走廊&#xff08;EEC&#xff09;"與RCEP協定疊加優勢&#xff0c;為中國企業提供面向亞太市場的戰略機遇。作為2022年泰國主要外資來源國之一&#xff0c;中國企業通過電子制造、智能家電、數據中心及新能源車等領域的投資深度參與泰國"4.0…