angular-websocket学习笔记

                    版权声明:本文为博主原创文章,未经博主允许不得转载。                        https://blog.csdn.net/u013480581/article/details/80830634                    </div>
                                                <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-cd6c485e8b.css">
                                    <div id="content_views" class="markdown_views prism-github-gist">
                <!-- flowchart 箭头图标 勿删 -->
                <svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
                    <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
                </svg>
                                        <p>主要记录在开发中使用angular-websocket的学习心得,如有错误请批评指正。</p>

前言

最近一直在学习开发一款物联网项目。(项目地址:https://blog.csdn.net/u013480581/article/details/80931778 )通过后端管理平台,可以将设备的信息反馈到用户端,并实时控制。后端用的workerman+websocket技术,可以实现长连接,双向通信。

主要是通信协议和指令的设计。设备端和用户端先在PC端模拟,demo通过JavaFX基本实现。因为考虑可以通过多种终端控制设备,初步想法是设计一款移动版web的前端。

web端的开发自己还是小白一枚。调研到angular+jqweui还挺符合自己的简单需求,可以实现单页web应用、仿微信UI。

由于JavaScript中提供websocket API,我们不需要操心数据的封装和发送。只需要关心自己的业务逻辑(设计指令实现功能),和与UI的交互。业务逻辑的设计不再啰嗦。

由于刚开始学习angulajs,发现将基于websocket的业务逻辑(主要就是①接收反馈后解析,②封装不同的指令发送)写在js文件后,可以实现②,但没有办法实现异步UI的刷新。

异步的websocket消息过来怎么更新UI?

我们知道angularjs的优点就是可以实现UI(html)和业务(js)的分离,类似与软件UI开发中MVC的思想。但是软件UI中通常是通过多线程异步更新UI的,并且API都封装好了。

AngularJS 教程 | 菜鸟教程中可以通过$http读取远程服务器的数据并异步更新UI,是对http数据的支持。但是websocket呢?

  • 在此之前,我们需要搞清楚angularjs是怎么绑定数据,异步更新UI的原理。这里有介绍:理解Angular的/ a p p l y ( ) 和 / a p p l y ( ) 和 / a p p l y ( ) 和 / apply()和/apply()和/ apply()和/ apply/apply/apply/rootScope.digest() unless autoApply is set to `false in the options. Callback gets called with a MessageEvent object.
    • 综上,注入factory服务,其中最重要的是实现onMessage,根据不同的业务逻辑功能,其流程:接收到反馈消息——>定义成一个对象——>在factory中return对象——>对象要与UI中$scope变量对应——>异步刷新UI的scope。

    • 注意:factory返回的对象组,①只能是数组和方法。②并且都需要在scope中声明,要不然咋刷新呢。由于官方的demo很简单,演示下自己的demo:

    app.factory('Messages', Messages);
    app.controller('mainController', function($scope, $rootScope, Messages) {
        //连接websocket
        $rootScope.Messages = Messages;
    });
    //反馈数据,需要异步刷新到UI中
    var dataA, dataB = null;
    var dataB = [];
    

function Messages($websocket) {

ws = $websocket("ws://"+document.domain+":8282");


ws.onMessage(onmessage);

ws.onError(function(event) {
  console.log("连接异常");
});

ws.onClose(function(event) {
    console.log("连接关闭");
});

ws.onOpen(function() {
  console.log("连接中..");
});
// setTimeout(function() {
//   ws.close();
// }, 500)

return {
    getdataA: function() {
        return dataA;
    },
    getdataB: function() {
       return dataB;
    },
    dataC: dataC

}

// 服务端发来消息时
function onmessage(e)
{
console.log(‘接受到的数据:’ + e.data);
var data = JSON.parse(e.data);
switch(data[‘type’]){
// 服务端ping客户端
case xxx:
parsedataA(data);
break;
case ‘xxx’:
parsedataB(data);
break;
case ‘xxx’:
parsedataC(data);
break;
}
}

//解析反馈A
function parsedataA(data){
	dataA = xxx;
}

//解析反馈B
function parsedataA(data){
	dataB = xxx;
}

//解析反馈c
function parsedataA(data){
	datac = [xxx];
}

//发送指令A
function sendA(pid){
    console.log('发送消息A');
    send(xxx, xxx);
}
//发送指令B
function sendB(){
    console.log('发送消息C');
    send(xxx, xxx);
}
...

//发送指令消息
function send(type, content){
    var json_data = '{"type":"'+ type +'","content":'+ content +'}';
    ws.send(json_data);
    console.log("发送的数据: "+ json_data + "\n");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
                                </div>
            <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-e44c3c0e64.css" rel="stylesheet">
                </div>
</article>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值