利用Node.js对某智能家居server重构
原文摘自我的前端博客,欢迎大家来訪问
之前负责过一个智能家居项目的开发,外包重庆一家公司的。我们主要开发server监控和集群版管理。
移动端和机顶盒的远程通信是用中间server完毕交互,server使用MINA NIO框架。非堵塞式的。能够看看曾经博客了解下某智能家居项目框架学习总结,或者其它资料JAVA
NIO原理,基于MINA框架高速开发网络应用程序。
在移动端或者机顶盒登录后会使用spring security 进行加密,主要是结合username和password来加密。生成一个唯一标示符。server来到一个请求时会检查相应的标示符来发送相关约定好的命令,如登录到移动端向server发送命名,server会生成如522f9e2a459de81d6a9e9eadfa9468d1的标示符,假设在机顶盒集合里也存在相应标示符的主控,则给他发送。
近期关注Node.js。这不就是Node的特性NIO吗?
让我们来着手重构一下,利用Node.js的先天优势,高并发,非堵塞式
首先对连接封装一下
var MyClient = function (client, username, password, type){
this.client = client;
this.username = username;
this.password = password;
this.type = type; //0是机顶盒,1是客户端
}
MyClient.prototype.write = function(msg) {
this.client.write(msg + '\r\n');
}
module.exports = MyClient;
每个连接都有它的username和password,也有它的client,也就是Socket。
也有一个标示符,表示是主控还是客户端
然后加入一个原型方法,用来向当前client发送信息
以下就是编写主程序了。使用Node.js进行网络应用程序的开发非常easy,具体大家能看懂
//tcp
var net = require('net');
var crypto = require('crypto');
var MyClient = require('./MyClient');
var server = net.createServer();
//客户端,如平台、移动端进来放在这个数组中
var clientArr = [];
//主控端,主要装的是机顶盒的连接
var boxArr = [];
server.on('connection', function(client){
client.setEncoding('utf-8');
client.write('plase input name|password|type :\n');
var myClient;
var message = '';
//发送消息
client.on('data', function(data){
//假设是非回车则累加
if('\r\n' != data || data == '' || data == null) {
message += data;
}else {
//说明是已经注冊的client
if(myClient) {
sendMsg(message, myClient);
}else{//说明是第一次进来
var userInfo = message.split('|');
var md5 = crypto.createHash('md5');
//使用username与password进行加密,放入password中
md5.update(userInfo[0] + userInfo[1]);
var password = md5.digest('hex');
myClient = new MyClient(client, userInfo[0], password, +userInfo[2]);
//假设是客户端
if(myClient.type) {
clientArr.push(myClient);
}else {
boxArr.push(myClient);
}
console.log('新加用户' + password);
}
message = '';
}
})
//断开时移除这个客户端
client.on('end', function(data){
console.log('end....');
//有还未登录就退出的情况
if(myClient) {
if(myClient.type) {
clientArr.splice(clientArr.indexOf(myClient), 1)
}else {
boxArr.splice(boxArr.indexOf(myClient), 1)
}
}
})
})
server.listen(3000);
function sendMsg(msg, myClient) {
console.log(' sendMsg : ' + msg);
var array = myClient.type == 1 ?
boxArr : clientArr;
for (var i = 0; i < array.length; i++) {
if (myClient.password == array[i].password) {
array[i].write(msg);
console.log(myClient.name + myClient.type == 1 ? '移动端' : '主控' + '发送消息....');
};
};
}
console.log('listening....');
我们来測试一下,利用telnet。使用约定好的协议进行登录,cqut 123456 1,cqut 123456 0,cqut2 123456 1。(这里不是空格,而是I符号,在文章内显示有问题,详细看代码切割就明确了)能够看到,cqut仅仅是给cqut的机顶盒发送。而cqut2的接受不到。
仅仅给相应的设备发。给其它设备不会发送
当然Mina还有其强大的过滤器,利用Node.js的中间件就能非常好的实现。请读者自行研究
end from http://www.hacke2.cn
利用Node.js对某智能家居server重构的更多相关文章
- 利用Node.js对某智能家居服务器重构
原文摘自我的前端博客,欢迎大家来访问 http://www.hacke2.cn 之前负责过一个智能家居项目的开发,外包重庆一家公司的,我们主要开发服务器监控和集群版管理. 移动端和机顶盒的远程通信是用 ...
- 【Node.js】利用node.js搭建服务器并访问静态网页
node.js是一门服务端的语言,下面讲讲如何利用node.js提供给我们的api来搭建服务器,并且访问静态网页 项目结构如下 ------------------------------------ ...
- 如何更好的利用Node.js的性能极限
通过使用非阻塞.事件驱动的I/O操作,Node.js为构建和运行大规模网络应用及服务提供了很好的平台,也受到了广泛的欢迎.其主要特性表现为能够处理庞大的并且高吞吐量的并发连接,从而构建高性能.高扩展性 ...
- Node.js 从零开发 web server博客项目[express重构博客项目]
web server博客项目 Node.js 从零开发 web server博客项目[项目介绍] Node.js 从零开发 web server博客项目[接口] Node.js 从零开发 web se ...
- Node.js 从零开发 web server博客项目[数据存储]
web server博客项目 Node.js 从零开发 web server博客项目[项目介绍] Node.js 从零开发 web server博客项目[接口] Node.js 从零开发 web se ...
- Node.js 从零开发 web server博客项目[koa2重构博客项目]
web server博客项目 Node.js 从零开发 web server博客项目[项目介绍] Node.js 从零开发 web server博客项目[接口] Node.js 从零开发 web se ...
- Node.js 从零开发 web server博客项目[安全]
web server博客项目 Node.js 从零开发 web server博客项目[项目介绍] Node.js 从零开发 web server博客项目[接口] Node.js 从零开发 web se ...
- Node.js 从零开发 web server博客项目[日志]
web server博客项目 Node.js 从零开发 web server博客项目[项目介绍] Node.js 从零开发 web server博客项目[接口] Node.js 从零开发 web se ...
- Node.js 从零开发 web server博客项目[登录]
web server博客项目 Node.js 从零开发 web server博客项目[项目介绍] Node.js 从零开发 web server博客项目[接口] Node.js 从零开发 web se ...
随机推荐
- python自动化测试学习笔记-4内置函数,处理json
函数.全局变量 写代码时注意的几点事项: 1.一般写代码的时候尽量少用或不用全局变量,首先全局变量不安全,大家协作的情况下,代码公用容易被篡改,其次全局变量会一直占用系统内容. 2.函数里如果有多个r ...
- [转]linux之磁盘配额(quota)
转自:http://www.jb51.net/LINUXjishu/78446.html 磁盘配额(quota)比较常用的几个情况是: * 针对WWW server,例如:每个人的网页空间的容量限制 ...
- Leetcode0523--Continuous Subarray Sum 连续和倍数
[转载请注明]https://www.cnblogs.com/igoslly/p/9341666.html class Solution { public: bool checkSubarraySum ...
- Oracle基础理论笔记(一):模式概念
---oracle 10g 1.在oracle数据库中,数据对象是以模式为单位进行组织和管理的.模式是指一系列的逻辑数据结构或对象的集合. 2.模式与用户名相对应,一个模式只能对应一个用户,并且该模式 ...
- 【译】x86程序员手册00 - 翻译起因
从上一次学习MIT的操作系统课程又过去了一年.上次学习并没有坚持下去.想来虽有种种原因,其还在自身无法坚持罢了.故此次再鼓起勇气重新学习,发现课程都已由2014改版为2016了.但大部分内容并没有改变 ...
- eclipse中代码整体左右移动的方法
1.向左:将要移动的代码选中,然后按TAB键2.向右:将要移动的代码选中,然后按shift+tab键 kettas: 2009-8-21
- Photoshop如何实现图片相对画布居中
先按ctrl+A,再选择要居中的图层,然后就会发现居中按钮被激活了
- Eclipse调试DEBUG时快速查看某个变量的值的快捷键
ctrl+shift+i
- 个人学习记录--取表中Name相同的最大值,非Group By,可延伸
), qy ), je INT); INSERT INTO @t SELECT '产品一', '北京', UNION ALL SELECT '产品一', '上海', UNION ALL SELECT ...
- Maven学习总结(7)——eclipse中使用Maven创建Web项目
Maven学习总结(七)--eclipse中使用Maven创建Web项目 一.创建Web项目 1.1 选择建立Maven Project 选择File -> New ->Project,如 ...