uni-app+vue3 +uni.connectSocket 使用websocket

前言

  • 最近在uni-app+vue3+websocket實現聊天功能,在使用websocket還是遇到很多問題

  • 這次因為是app手機應用,就沒有使用websocket對象,使用的是uni-app的uni.connectSocket

  • 為了方便測試這次用的是node.js一個簡單的dom,來聯調模擬發數據,過程有意思

首先模擬一個node.js服務來測試-代碼實現

1.在桌面建立一個空文件夾-命名英文

2.打開cmd

3.初始化-下包

// 初始化包
npm init -y
?
// 下載node框架包
npm i express --save
?
// 下載websocket模塊
npm i ws

4.回到項目根文件創建根文件-app.js-代碼如下

// 引入express框架
var app = require('express')();
var server = require('http').Server(app);
?
// 引入ws框架支持webSocket實現
var WebSocket = require('ws');
?
// 針對8080接口進行監聽
var wss = new WebSocket.Server({ port: 8080 });
?
// 當建立連接后,打印日志
wss.on('connection', function connection(ws) {
?console.log('建立連接');// 同時返回服務端收到的信息ws.on('message', function incoming(message) {// const buffer = Buffer.from(message,'hex')// console.log('ddd',buffer.toString('utf-8'));// console.log('message',message);console.log('接受前端消息: %s', message);});
?// 返回信息ws.send('接收到消息了');
});
?
// 綁定訪問地址
app.get('/', function (req, res) {res.sendfile(__dirname + '/index.html');
});
?
app.listen(3000);

5.來到終端運行服務

node ./app.js

6.websocket服務地址

本機ip+3000端口

來到uni-app+vue3項目

1.來到工具文件utils下創建websocket.js 文件-代碼如下

import {ref
} from "vue"
?
?
const websoket = ref(null);
?
?
const webSoketInit = (role, id) => {
?const wsUrl = "ws://localhost:8080"
?// return Promise
?websoket.value = uni.connectSocket({url: wsUrl,success: () => {console.log('websoket連接成功');},fail: () => {console.log('websoket連接失敗');uni.showToast({title: 'websoket連接失敗',icon: 'error',duration: 2000,});},});
?websoket.value.onOpen((res) => {if (websoket.value.readyState === 1) {websoket.value.send({data: '測試回復',})}
?});
?websoket.value.onClose(() => {console.log('已經被關閉了');});
?websoket.value.onMessage((res) => {console.log('接收到后端發送消息', res);});
?
};
?
// 獲取websocket對象
const getWebSocket = () => {return websoket
};
?
?
// 關閉websocket【離開這個頁面的時候執行關閉
const closeSocket = () => {websoket.value.close({success(res) {this.is_open_socket = false;console.log('關閉成功', res);},fail(err) {console.log('關閉失敗', err);},});
};
?
const sendMessage = (message) => {console.log("發送消息", message)
?if (websoket.value.readyState === 1) {websoket.value.send({data: message,})}
};
export {getWebSocket,websoket,webSoketInit,closeSocket,sendMessage,
};
?

2.來到任意頁面-初始化建立連接

<script setup>import {nextTick} from "vue"
?import {onLoad,onReady} from "@dcloudio/uni-app";
?
?// websocket 通訊import {getWebSocket,websoket,webSoketInit,closeSocket,sendMessage} from "@/utils/webSocket.js"
?// 判斷當前視口大小onLoad((options) => {webSoketInit()})onReady(() => {?// 獲取websocket對象let ws = getWebSocket()
?
?// 接受后端消息觸發ws.value.onMessage((e) => {console.log('接受后端消息', e);})})
</script>
?

3.如圖-代碼效果

注意細節

1.前端使用websoket.value.send() 發送消息時后端接收一直都是undefined

  • 因為我們不是使用的瀏覽器的websocket對象,使用的是uni-app封裝過一層的uni.connectSocket

  • 想在我們的實例對象是uni.connectSocket,需要按照uni-app的格式發送數據({data:'數據'})

  • 官網地址-uni.connectSocket(OBJECT) | uni-app官網

  • 如圖

2.真機模擬時發現只有運行連接成功接收到消息,再用按鈕觸發后端服務也收不到消息-連接是成功的

  • 因為本機運行到瀏覽器測試時,是可以訪問到自己內網服務

  • 真機運行雖然也是局域網連接wifi-但手機機制可能只會去公網上找-意思就是服務要上線


總結:

經過這一趟流程下來相信你也對 uni-app+vue3 +uni.connectSocket 使用websocket 有了初步的深刻印象,但在實際開發中我 們遇到的情況肯定是不一樣的,所以我們要理解它的原理,萬變不離其宗。加油,打工人!

有什么不足的地方請大家指出謝謝 -- 風過無痕

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

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

相關文章

Apache Flume Agent內部原理

Apache Flume Agent內部原理 Apache Flume 是一個可擴展的、分布式的日志收集、聚合和傳輸系統。在 Flume 中&#xff0c;Agent 是一個獨立的進程&#xff0c;負責接收、傳輸和處理數據。Agent 內部包含多個組件&#xff0c;每個組件都有不同的功能和責任。 1. Source&#xff…

5個 Elasticsearch 核心組件

Elasticsearch 是一個基于 Lucene 的搜索引擎&#xff0c;它提供了分布式、高可用、多租戶的能力。Elasticsearch 的核心組件包括節點&#xff08;Node&#xff09;、集群&#xff08;Cluster&#xff09;、索引&#xff08;Index&#xff09;、分片&#xff08;Shard&#xff…

三下鄉社會實踐投稿攻略在這里

在當今信息爆炸的時代&#xff0c;如何讓自己的聲音被更多人聽到&#xff0c;成為許多人和企業所關心的問題。其中&#xff0c;向各大媒體網站投稿&#xff0c;成為了一種常見的宣傳方式。但是&#xff0c;如何投稿各大媒體網站&#xff1f;新聞媒體發文策略又有哪些呢&#xf…

Flutter Clipboard實現復制功能

Flutter內置了Clipboard 功能,可以幫助我們完成復制粘貼的功能,比如我們想把“hello flutter”復制到粘貼板,代碼如下: TextButton(onPressed: () async {await Clipboard.setData(ClipboardData(text: hello flutter)

基于SpringBoot設計模式之開端

文章目錄 前言引言開始 前言 為了更好的在項目中&#xff0c;能更加優雅的使用設計模式&#xff0c;比較針對性的解決我們的問題。我將在這個專欄詳細的描述23種設計模式&#xff0c;為了與時俱進&#xff0c;我打算通過springboot的形式將23種設計模式全部擼完&#xff01; 引…

光耦推薦—高速風筒方案中用到哪些光耦型號

高速風筒是現代生活中常見的電器設備&#xff0c;廣泛應用于家庭、商業和工業領域&#xff1b;光耦是一種能夠將輸入信號轉換成輸出信號的元器件&#xff0c;其作用在于將電氣信號轉換成光信號&#xff0c;從而實現電路的隔離和保護&#xff1b;采用光耦可實現對風機轉速和溫度…

【管理咨詢寶藏99】離散制造智能工廠戰略規劃方案

本報告首發于公號“管理咨詢寶藏”&#xff0c;如需閱讀完整版報告內容&#xff0c;請查閱公號“管理咨詢寶藏”。 【管理咨詢寶藏99】離散制造智能工廠戰略規劃方案 【格式】PDF版本 【關鍵詞】智能制造、先進制造業轉型、數字化轉型 【核心觀點】 - 推進EHS、品質一致性、生…

【無標題】QCC 308x 518x 517x增加usb voice 32k采樣率

QCC 308x 518x 517x增加usb voice 32k采樣率 diff --git a/adk/src/domains/audio/kymera/kymera_usb_voice.c b/adk/src/domains/audio/kymera/kymera_usb_voice.c index 6dd82061..532c4ad8 100755 --- a/adk/src/domains/audio/kymera/kymera_usb_voice.c +++ b/adk/src/dom…

Failed to start tomcat.service: Unit is not loaded properly: Bad message 如何解決?

錯誤 “Failed to start tomcat.service: Unit is not loaded properly: Bad message” 通常意味著的 tomcat.service systemd 配置文件存在語法錯誤或配置不正確。為了解決這個問題&#xff0c;一步步檢查和修正這個服務文件。 1. 檢查 tomcat.service 文件 首先&#xff0c…

CSS文字描邊,文字間隔,div自定義形狀切割

clip-path: polygon( 0 0, 68% 0, 100% 32%, 100% 100%, 0 100% );//這里切割出來是少一角的正方形 letter-spacing: 1vw; //文字間隔 -webkit-text-stroke: 1px #fff; //文字描邊1px uniapp微信小程序頂部導航欄設置透明&#xff0c;下拉改變透明度 onP…

Docker部署RabbitMQ集群(單服務器多端口)

rabbitmq.conf在mq1、mq2、mq3下 ####文件內容 loopback_users.guest false listeners.tcp.default 5672 cluster_formation.peer_discovery_backend rabbit_peer_discovery_classic_config cluster_formation.classic_config.nodes.1 rabbitmq1 cluster_formation.classi…

SQL注入(sqli-labs第一關)

sqli-labs第一關 方法一&#xff1a;手工注入 來到第一關&#xff0c;圖上說我們需要一個數字的參數 于是我們先手工注入?id1 and 11 跟?id1 and 12發現頁面沒有報錯 每張截圖上面頁面中有select查詢語句&#xff0c;這是我在第一關的源碼中加上了echo "$sql ";…

SSM【Spring SpringMVC Mybatis】——Mybatis(二)

如果對一些基礎理論感興趣可以看這一期&#x1f447; SSM【Spring SpringMVC Mybatis】——Mybatis 目錄 1、Mybatis中參數傳遞問題 1.1 單個普通參數 1.2 多個普通參數 1.3 命名參數 1.4 POJO參數 1.5 Map參數 1.6 Collection|List|Array等參數 2、Mybatis參數傳遞【#與…

STL——stack容器【棧】

stack基本概念&#xff1a; 概念&#xff1a; 是一種先進后出的數據結構&#xff0c;它只有一個出口 因為只有一端可以調用&#xff0c;所以棧不支持遍歷操作 棧的操作&#xff1a; 棧中進入數據稱為&#xff1a;入棧(push) 棧中彈出數據稱為&#xff1a;出棧(pop) 生活中…

C#編程模式之享元模式

創作背景&#xff1a;各位朋友&#xff0c;我們繼續學習C#的編程模式&#xff0c;本文主要介紹享元模式。享元模式是一種結構型設計模式&#xff0c;它主要用于減少創建對象的數量&#xff0c;從而提高程序性能。它通過共享對象的方式來減少內存的使用&#xff0c;特別是系統中…

springCloud服務降級使用到的組件

服務降級在Spring Cloud中通常使用的組件包括斷路器&#xff08;Circuit Breaker&#xff09;和降級處理器&#xff08;Fallback&#xff09;。以下是它們的概念表述&#xff1a; 斷路器&#xff08;Circuit Breaker&#xff09;&#xff1a;斷路器是一種設計模式&#xff0c;…

【多客陪玩】陪玩小程序源碼APP+小程序+公眾號開發 -源碼交付,線下可爆改家政,整理師等功能

簡述 隨著電競行業的快速發展&#xff0c;電競陪玩APP正在逐漸成為用戶在休閑娛樂時的首選。為了吸引用戶和提高用戶體驗&#xff0c;電競陪玩APP開發需要定制一些特色功能&#xff0c;并通過合適的盈利模式來獲得收益。本文將為您介紹電競陪玩APP開發需要定制的特色功能以及常…

M21121G-11

M21121專為當今要求苛刻的電信、數據通信和廣播視頻應用而設計&#xff0c;是一款低功耗、高速34x34交叉點交換機&#xff0c;具有輸入均衡和內置系統測試功能。在所有通道運行的情況下&#xff0c;該設備的功耗通常低至3.5瓦。PowerScaler?功能提供動態可擴展的開關設置&…

升壓、降壓、升降壓LED恒流驅動器

AP9139 是一款外圍電路簡單的調光無頻閃降壓 LED 恒流驅動器&#xff0c;支持升壓、降壓、及升降壓拓撲的 應用&#xff0c;適用于6.5-80V輸入電壓范圍的LED恒流照明領 域&#xff0c;調光深度深&#xff0c;低輝負載調整率和一致性好。 AP9139芯片的輸出電通過ISENSEN對ISENEP…

React 之 lazy(延遲加載)(十六)

lazy 能夠讓你在組件第一次被渲染之前延遲加載組件的代碼。 在組件外部調用 lazy&#xff0c;以聲明一個懶加載的 React 組件: import { lazy } from react;const MarkdownPreview lazy(() > import(./MarkdownPreview.js)); 配合 Suspense 實現懶加載組件 //App.js imp…