Websocket通信協(xié)議在數(shù)字孿生中的應(yīng)用
寫在前面
面試官:除了 HTTP,你還用過什么通信協(xié)議?
答:Websocket 在數(shù)字孿生中的應(yīng)用
隨著 數(shù)智化 轉(zhuǎn)型的推進,越來越多行業(yè)開始加入 數(shù)智化改造 大軍,所謂數(shù)智化,其實就是數(shù)據(jù)化、智能化,主要強調(diào)的是利用目前發(fā)展迅猛的計算機、網(wǎng)絡(luò)技術(shù)、AI等先進技術(shù),對傳統(tǒng)行業(yè)進行改造、賦能,促進傳統(tǒng)行業(yè)向先進技術(shù)靠攏,通過先進技術(shù)的賦能,使傳統(tǒng)行業(yè)得到更快的發(fā)展。
而在這一波轉(zhuǎn)型中,尤其亮眼的就要數(shù) 數(shù)字孿生 這個概念了,數(shù)字孿生在我看來,可以簡單分兩部分理解:
第一部分為同步孿生,即利用各種方式采集到的各種數(shù)據(jù),通過糅合、整理,在計算機上模擬出與現(xiàn)實世界相同的東西,即 孿生,并且在現(xiàn)實世界發(fā)生變化時,孿生世界中的事物能夠呈現(xiàn)相同的狀態(tài)。
第二部分為預(yù)測孿生,即通過對于大量數(shù)據(jù)的采集、分析,能夠?qū)?shù)據(jù)與事物發(fā)展的態(tài)勢進行結(jié)合,建立模型,達到預(yù)測、模擬效果,提前預(yù)防災(zāi)難發(fā)生等。
目前來看,業(yè)界開發(fā)出來的數(shù)字孿生產(chǎn)品中,分為二維、三維、二維 + 三維這幾種模式,其中二維數(shù)字孿生主要是將現(xiàn)實世界的數(shù)據(jù)做處理后,利用各種可視化表格進行展示,而三維數(shù)字孿生則是利用 WebGL、Three、UE4 等技術(shù),將現(xiàn)實場景直接建模、完全孿生到計算機上,通過數(shù)據(jù)孿生,展示與現(xiàn)實場景相同的孿生場景。
數(shù)字孿生內(nèi)容很多,本次先從簡單的二維數(shù)字孿生的數(shù)據(jù)展示入手,介紹一下二維數(shù)據(jù)孿生應(yīng)用最簡單的模塊。
數(shù)字孿生中的通訊協(xié)議
Websocket 是什么
WebSocket 是一種在單個 TCP 連接上進行 全雙工 通信的協(xié)議。WebSocket通信協(xié)議于2011年被[IETF]定為標(biāo)準(zhǔn)RFC 6455,并由RFC7936補充規(guī)范。WebSocket API也被 W3C 定為標(biāo)準(zhǔn)。
WebSocket使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡單,允許服務(wù)端主動向客戶端推送數(shù)據(jù)。在WebSocket API中,瀏覽器和服務(wù)器只需要完成一次握手,兩者之間就直接可以創(chuàng)建持久性的連接,并進行雙向數(shù)據(jù)傳輸。
Websocket 配置
本次以 Echarts 作為展示數(shù)據(jù)的表格,Node.js 服務(wù)器作為數(shù)據(jù)源,演示簡單的數(shù)據(jù)更新通訊過程
基于 Node.js 的 Websocket 服務(wù)器搭建
創(chuàng)建 Websocket Server
// 引入 ws 模塊 const WebSocket = require('ws'); // 創(chuàng)建 server 實例并監(jiān)聽 3000 端口 const server = new WebSocket.Server({host:'localhost',port:3000},()=>{ console.log('WebsocketServer Start !') });
添加客戶端連接成功回調(diào)
當(dāng)客戶端對服務(wù)端發(fā)起連接時,服務(wù)端能夠在 connection 事件中收到請求
server.on('connection',(client)=>{ console.log('連接成功') })
添加客戶端消息回調(diào)
由于 Websocket 是全雙工的,所以客戶端和服務(wù)端都可以向?qū)Ψ桨l(fā)送消息,因此,我們需要添加消息回調(diào),接收客戶端發(fā)送的消息
server.on('connection',(client)=>{ console.log('連接成功') // 添加消息回調(diào) client.on('message',(msg)=>{ console.log(msg); }) })
基于Vue 的 Websocket 客戶端搭建
客戶端與服務(wù)端基本差不多,創(chuàng)建連接、添加連接回調(diào)、消息回調(diào)
var ws = new WebSocket("ws://localhost:3000"); //服務(wù)端向客戶端連接執(zhí)行 ws.onopen = ()=>{ console.log('連接建立') } ws.onmessage = (msg) => { console.log('收到消息:', msg.data) }
通過 Websocket 更新 Echart 表格數(shù)據(jù)(基于 Vue + node)
搭建 echart 柱狀圖結(jié)構(gòu)
<template> <div id="Websocket-container"></div> </template>
添加柱狀圖初始化參數(shù)
init(){ var chartDom = document.getElementById('Websocket-container'); this.myChart = echarts.init(chartDom); var option; option = { xAxis: { type: 'category', data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] }, yAxis: { type: 'value' }, series: [ { data: [120, 200, 150, 80, 70, 110, 130], type: 'bar', showBackground: true, backgroundStyle: { color: 'rgba(180, 180, 180, 0.2)' } } ] } option && this.myChart.setOption(option); },
添加柱狀圖更新函數(shù)
update(newData) { let option = { series: { data: newData, } } this.myChart.setOption(option) },
添加 Websocket 連接與接收數(shù)據(jù)函數(shù)
initWebsocket(){ var ws = new WebSocket("ws://localhost:3000"); //服務(wù)端向客戶端連接執(zhí)行 ws.onopen = ()=>{ console.log('連接建立') } ws.onmessage = (msg) => { console.log('收到消息:', msg.data) this.update(JSON.parse(msg.data)) } }
向 Websocket Server 添加生成隨機數(shù)據(jù)的函數(shù)
通過生成隨機的數(shù)據(jù),模擬現(xiàn)實中數(shù)據(jù)的變化,并推送到前端
function createDatas(){ let arr = [] for(let i=0;i<7;i++){ arr.push(Math.floor(Math.random()*100)) } console.log(arr) return arr }
添加數(shù)據(jù)監(jiān)控函數(shù),即數(shù)據(jù)更新函數(shù)
// 每 5s 想前端更新一次 function startMonitor(client){ setInterval(() => { let newDatas = createDatas() client.send(JSON.stringify(newDatas)) }, 1000 * 5); }
將數(shù)據(jù)監(jiān)控函數(shù)綁定到 Websocket 的 connection 事件回調(diào)中
server.on('connection',(client)=>{ console.log('連接成功') // 添加消息回調(diào) client.on('message',(msg)=>{ console.log(msg); }) // 開始數(shù)據(jù)監(jiān)聽,當(dāng)數(shù)據(jù)更新時想客戶端推送數(shù)據(jù) startMonitor(client) })
啟動前端、后端,測試效果
為何采用 Websocket 而不是 HTTP
首先我們知道對于數(shù)字孿生這樣的應(yīng)用場景,實時同步現(xiàn)實數(shù)據(jù)到孿生世界是必要的環(huán)節(jié),而當(dāng)數(shù)據(jù)發(fā)送變化時,孿生世界如果想要做到立即響應(yīng),那么就需要立刻通過網(wǎng)絡(luò)獲取數(shù)據(jù)
采用 HTTP
HTTP 作為單工通訊,服務(wù)器無法主動推送數(shù)據(jù)到前端,那么只能采用輪詢的方式,而采取這樣子的方式有一個矛盾點存在,一方面,為了更加實時的獲取到最新的數(shù)據(jù),輪詢的間隔時間應(yīng)該盡可能小,而另一方面,由于發(fā)送 HTTP 會耗費大量的流量,所以輪詢時間應(yīng)該盡可能大,從而節(jié)省流量的浪費,因此,采取 HTTP 輪詢的方式很難拿出可靠、高效的方案
采用 Websocket
Websocket 作為全雙工的通訊方式,它能夠做到當(dāng)服務(wù)器檢測到數(shù)據(jù)更新的時候,主動向客戶端推送數(shù)據(jù),而在沒有數(shù)據(jù)更新的時候,網(wǎng)絡(luò)帶寬完全是空閑的,不會像采用 HTTP 一樣,中間會有無數(shù)次無意義的數(shù)據(jù)請求,所以采取 Websocket 才是更加合理的數(shù)據(jù)更新方式
總結(jié)
通過對于數(shù)字孿生應(yīng)用場景的學(xué)習(xí)和實踐,能夠了解到與以往習(xí)慣的通過 HTTP 接口獲取數(shù)據(jù)并進行渲染所不同的方式,也看到了更多的可能,對于數(shù)字孿生,這里所介紹的 Websocket 可能連冰山一角都算不上,希望繼續(xù)深入研究,探索更多、更深入的 數(shù)字孿生相關(guān)的技術(shù),更多關(guān)于Websocket數(shù)字孿生的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
深入理解ES6之?dāng)?shù)據(jù)解構(gòu)的用法
本文介紹了深入理解ES6之?dāng)?shù)據(jù)解構(gòu)的用法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01JavaScript中常用數(shù)據(jù)處理函數(shù)groupBy的用法詳解
數(shù)據(jù)處理與分析中,對數(shù)據(jù)進行分組是非常常見的功能,不論是實際工作中,還是在面試的場景中應(yīng)用十分廣泛,尤其在函數(shù)式編程中?groupBy?十分常見,下面我們就來學(xué)習(xí)一下groupBy的用法吧2023-12-12js獲取input標(biāo)簽的輸入值實現(xiàn)代碼
input標(biāo)簽的輸入值通過js進行獲取,部分標(biāo)簽和類是封裝在框架內(nèi)的,其效果和html標(biāo)簽差不多,具體實現(xiàn)如下,感興趣的朋友可以參考下,希望對大家有所幫助2013-08-08JS創(chuàng)建優(yōu)美的頁面滑動塊效果 - Glider.js
JS創(chuàng)建優(yōu)美的頁面滑動塊效果 - Glider.js...2007-09-09JS實現(xiàn)CheckBox復(fù)選框全選全不選功能
在網(wǎng)站的管理后臺應(yīng)用此功能居多,如一次性處理多個產(chǎn)品,或?qū)ξ恼碌膭h除對產(chǎn)品的下架等處理,一條一條的點顯然有一些麻煩,如果能每一行放一個checkbox,然后統(tǒng)一處理就好辦的多了,今天我就用簡單的篇幅來講解一下這個功能的實現(xiàn)原理和實現(xiàn)過程。2015-05-05修復(fù)ie8&chrome下window的resize事件多次執(zhí)行
window.onresize 事件 專用事件綁定器 v0.1,用于解決 lte ie8 & chrome 及其他可能會出現(xiàn)的 原生 window.resize 事件多次執(zhí)行的 BUG.2011-10-10