楼主: 森友js
1606 0

[数据挖掘理论与案例] 从零开始学习3D可视化之数据对接(2) [推广有奖]

  • 0关注
  • 0粉丝

大专生

35%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
38.0054
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
273 点
帖子
20
精华
0
在线时间
29 小时
注册时间
2020-10-19
最后登录
2023-7-12

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
在日常使用的互联网产品中,很多都是前后端数据的交互来完成的,说到数据交互就不得不提Ajax和WebSocket,它们可是数据交互的利器,那么它们分别是什么?Ajax上篇文章已经讲过了,那WebSocket又是什么呢?

WebSocket 是 HTML5 一种新的协议,实现了浏览器与服务器之间的全双工通信。

为了建立一个 WebSocket 连接,客户端浏览器首先要向服务器发起一个 HTTP 请求,这个请求和通常的 HTTP 请求不同,其中附加头信息"Upgrade: WebSocket"表明这是一个申请协议升级的 HTTP 请求,服务器端解析这些附加的头信息然后产生应答信息返回给客户端,客户端和服务器端的 WebSocket 连接就建立起来了,双方就可以通过这个连接通道自由的传递信息,并且这个连接会持续存在直到客户端或者服务器端的某一方主动的关闭连接。






其本质是先通过 HTTP/HTTPS 协议进行握手后创建一个用于交换数据的 TCP 连接,服务端与客户端通过此 TCP 连接进行数据的双向实时传输,直到有一方主动发送关闭连接请求或出现网络错误才会关闭连接。






下面来一个ThingJS中的WebSocket数据对接示例,点击【开启读取】进行数据读取,读取到的数据将在数据详情面板进行显示,当温度值大于20℃时,车辆设置红色效果,点击【关闭读取】停止数据读取。

  1. var app; // App对象
  2. var timer; // 定时器
  3. var webSocket;

  4. // 引入样式文件
  5. THING.Utils.dynamicLoad(['/guide/examples/css/measure/panel.css'], function() {
  6. app = new THING.App({
  7. url: 'https://www.thingjs.com/static/models/storehouse'
  8. });

  9. app.on('load', function() {
  10. // 设置摄像机位置和目标点
  11. app.camera.position = [44.38316010361372, 22.256383671664036, 37.42310488848945];
  12. app.camera.target = [19.488379488180318, 0.17527928595920675, 5.827049588512047];

  13. var car = app.query('car01')[0];
  14. // 物体身上创建monitorData对象 用于存储动态监控数据
  15. car.monitorData = {
  16. '温度': ''
  17. };

  18. new THING.widget.Button('开启读取', function() {
  19. updateData(car);
  20. });

  21. new THING.widget.Button('关闭读取', function() {
  22. stopUpdate();
  23. });

  24. createHtml();
  25. initThingJsTip("WebSocket 实现了数据的实时双向通信。且通信不受同源策略的限制,不存在跨域问题。<br>点击【开启读取】进行数据读取,读取到的数据将在数据详情面板进行显示,当温度值大于20℃时,车辆设置红色效果,点击【关闭读取】停止数据读取!");
  26. })
  27. })

  28. // 创建html界面
  29. function createHtml() {
  30. // 数据详情界面
  31. let dataDetails =
  32. `<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;">
  33. <div class="tj-close"></div>
  34. <div class="tj-title" style="cursor: move; user-select: none;">数据详情</div>
  35. <div class="tj-panel-body" style="padding-top: 0px;">
  36. <div class="tj-panel-container tj-scroll-bar">
  37. <table class="tj-table">
  38. <div class="empty">暂无数据</div>
  39. </table>
  40. </div>
  41. </div>
  42. </div>`;
  43. $('#div2d').append(dataDetails);
  44. // 点击按钮关闭面板
  45. $('#dataDetails .tj-close').on('click', function() {
  46. $('#dataDetails').css('display', 'none');
  47. });
  48. }

  49. /**
  50. * 数据对接
  51. */
  52. function updateData(obj) {

  53. // 对接自有websoket服务器
  54. if (!webSocket) {

  55. // 如果 ThingJS 网站是 https 则对应 wss
  56. // 如果 ThingJS 网站是 http 则对应 ws 即可
  57. webSocket = new WebSocket('wss://3dmmd.cn/wss');
  58. // 建立 websocket 连接成功触发事件
  59. webSocket.onopen = function() {
  60. console.log("websoket服务器连接成功...");
  61. };

  62. // 接收服务端数据时触发事件
  63. webSocket.onmessage = function(evt) {
  64. var data = evt.data;
  65. nowDatetime();
  66. if (($('.empty').length)) {
  67. $('.empty').remove();
  68. }
  69. if (!($('.tj-group').length)) {
  70. let tbody = `<tbody class="tj-group" id="tb-line"></tbody>`;
  71. $('.tj-table').prepend(tbody);
  72. }
  73. let tr =
  74. `<tr class="tj-group-content">
  75. <td class="tj-key">` + dateString + `</td>
  76. <td class="tj-value">` + data + `℃</td>
  77. </tr>`;
  78. $('.tj-group').prepend(tr);
  79. // 设置物体身上的监控数据
  80. obj.setAttribute("monitorData/温度", data);
  81. changeColor(obj);
  82. };

  83. webSocket.onclose = function(evt) {
  84. console.log("websoket关闭...");
  85. webSocket = null;
  86. }
  87. }
  88. }

  89. /**
  90. * 关闭数据请求
  91. */
  92. function stopUpdate() {
  93. // 关闭连接
  94. webSocket.close();
  95. }

  96. /**
  97. * 取得系统日期
  98. */
  99. function nowDatetime() {
  100. var date = new Date();
  101. var hours = (date.getHours()) > 9 ? (date.getHours()) : "0" + (date.getHours());
  102. var minutes = (date.getMinutes()) > 9 ? (date.getMinutes()) : "0" + (date.getMinutes());
  103. var seconds = (date.getSeconds()) > 9 ? (date.getSeconds()) : "0" + (date.getSeconds());
  104. dateString =
  105. hours + ":" +
  106. minutes + ":" +
  107. seconds;
  108. return dateString;
  109. }

  110. /**
  111. * 当车辆的温度值超过20时,更改小车颜色
  112. */
  113. function changeColor(obj) {
  114. var value = obj.getAttribute("monitorData/温度");
  115. if (value > 20) {
  116. obj.style.color = 'rgb(255,0,0)';
  117. } else {
  118. obj.style.color = null;
  119. }
  120. }
复制代码

总结一下WebSocket最大的优点,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,真正实现了数据的实时双向通信。并且 WebSocket 通信不受同源策略的限制,不存在跨域问题。





二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:从零开始学习 从零开始 可视化 attribute function

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-26 15:06