在日常应用的互联网产品中,很多都是前后端数据的交互来实现的,说到数据交互就不得不提Ajax和WebSocket,它们可是数据交互的利器,那么它们别离是什么?Ajax上篇文章曾经讲过了,那WebSocket又是什么呢?
WebSocket 是 HTML5 一种新的协定,实现了浏览器与服务器之间的全双工通信。
为了建设一个 WebSocket 连贯,客户端浏览器首先要向服务器发动一个 HTTP 申请,这个申请和通常的 HTTP 申请不同,其中附加头信息"Upgrade: WebSocket"表明这是一个申请协定降级的 HTTP 申请,服务器端解析这些附加的头信息而后产生应答信息返回给客户端,客户端和服务器端的 WebSocket 连贯就建设起来了,单方就能够通过这个连贯通道自在的传递信息,并且这个连贯会继续存在直到客户端或者服务器端的某一方被动的敞开连贯。
其本质是先通过 HTTP/HTTPS 协定进行握手后创立一个用于替换数据的 TCP 连贯,服务端与客户端通过此 TCP 连贯进行数据的双向实时传输,直到有一方被动发送敞开连贯申请或呈现网络谬误才会敞开连贯。
上面来一个ThingJS中的WebSocket数据对接示例,点击【开启读取】进行数据读取,读取到的数据将在数据详情面板进行显示,当温度值大于20℃时,车辆设置红色成果,点击【敞开读取】进行数据读取。
var app; // App对象var timer; // 定时器var webSocket; // 引入款式文件THING.Utils.dynamicLoad(['/guide/examples/css/measure/panel.css'], function() { app = new THING.App({ url: 'https://www.thingjs.com/static/models/storehouse' }); app.on('load', function() { // 设置摄像机地位和指标点 app.camera.position = [44.38316010361372, 22.256383671664036, 37.42310488848945]; app.camera.target = [19.488379488180318, 0.17527928595920675, 5.827049588512047]; var car = app.query('car01')[0]; // 物体身上创立monitorData对象 用于存储动静监控数据 car.monitorData = { '温度': '' }; new THING.widget.Button('开启读取', function() { updateData(car); }); new THING.widget.Button('敞开读取', function() { stopUpdate(); }); createHtml(); initThingJsTip("WebSocket 实现了数据的实时双向通信。且通信不受同源策略的限度,不存在跨域问题。<br>点击【开启读取】进行数据读取,读取到的数据将在数据详情面板进行显示,当温度值大于20℃时,车辆设置红色成果,点击【敞开读取】进行数据读取!"); })}) // 创立html界面function createHtml() { // 数据详情界面 let dataDetails = `<div id="dataDetails" class="tj-panel property-panel tj-has-title tj-sizable tj-property-panel tj-pinned" style="position: absolute; right: 10px; top: 220px; width: 315px; height: 416px; transform: none;"> <div class="tj-close"></div> <div class="tj-title" style="cursor: move; user-select: none;">数据详情</div> <div class="tj-panel-body" style="padding-top: 0px;"> <div class="tj-panel-container tj-scroll-bar"> <table class="tj-table"> <div class="empty">暂无数据</div> </table> </div> </div> </div>`; $('#div2d').append(dataDetails); // 点击按钮敞开面板 $('#dataDetails .tj-close').on('click', function() { $('#dataDetails').css('display', 'none'); });} /** * 数据对接 */function updateData(obj) { // 对接自有websoket服务器 if (!webSocket) { // 如果 ThingJS 网站是 https 则对应 wss // 如果 ThingJS 网站是 http 则对应 ws 即可 webSocket = new WebSocket('wss://3dmmd.cn/wss'); // 建设 websocket 连贯胜利触发事件 webSocket.onopen = function() { console.log("websoket服务器连贯胜利..."); }; // 接管服务端数据时触发事件 webSocket.onmessage = function(evt) { var data = evt.data; nowDatetime(); if (($('.empty').length)) { $('.empty').remove(); } if (!($('.tj-group').length)) { let tbody = `<tbody class="tj-group" id="tb-line"></tbody>`; $('.tj-table').prepend(tbody); } let tr = `<tr class="tj-group-content"> <td class="tj-key">` + dateString + `</td> <td class="tj-value">` + data + `℃</td> </tr>`; $('.tj-group').prepend(tr); // 设置物体身上的监控数据 obj.setAttribute("monitorData/温度", data); changeColor(obj); }; webSocket.onclose = function(evt) { console.log("websoket敞开..."); webSocket = null; } }} /** * 敞开数据申请 */function stopUpdate() { // 敞开连贯 webSocket.close();} /** * 获得零碎日期 */function nowDatetime() { var date = new Date(); var hours = (date.getHours()) > 9 ? (date.getHours()) : "0" + (date.getHours()); var minutes = (date.getMinutes()) > 9 ? (date.getMinutes()) : "0" + (date.getMinutes()); var seconds = (date.getSeconds()) > 9 ? (date.getSeconds()) : "0" + (date.getSeconds()); dateString = hours + ":" + minutes + ":" + seconds; return dateString;} /** * 当车辆的温度值超过20时,更改小车色彩 */function changeColor(obj) { var value = obj.getAttribute("monitorData/温度"); if (value > 20) { obj.style.color = 'rgb(255,0,0)'; } else { obj.style.color = null; }}
总结一下WebSocket最大的长处,服务器能够被动向客户端推送信息,客户端也能够被动向服务器发送信息,真正实现了数据的实时双向通信。并且 WebSocket 通信不受同源策略的限度,不存在跨域问题。
—————————————————
数字孪生可视化:https://www.thingjs.com/