利用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 ...
随机推荐
- android 中的Context(一)
context的功能如此强大,它是activity的父类. public abstract class Context { ... public abstract Object getSystemSe ...
- LDA PCA 学习笔记
提要: 本文主要介绍了和推导了LDA和PCA,参考了这篇博客 LDA LDA的原理是,将带上标签的数据(点),通过投影的方法,投影到维度更低的空间中,使得投影后的点,会形成按类别区分,一簇一簇的情况, ...
- 题解报告:hdu 1142 A Walk Through the Forest
题目链接:acm.hdu.edu.cn/showproblem.php?pid=1142 Problem Description Jimmy experiences a lot of stress a ...
- 【MySQL】二进制分发安装
操作系统:Red Hat Enterprise Linux Server release 6.5 Mysql安装包:mysql-5.6.34-linux-glibc2.5-x86_64.tar.gz ...
- IOS7 APP 升级的10个TIP 建议
There is no way to preserve the iOS 6 style status bar layout. The status bar will always overlap yo ...
- js中关于new Object时传参的一些细节分析
1, 参数是一个对象,核心js对象(native ECMAScript object)或宿主对象(host object),那么将直接返回该对象. 其生成的对象构造器仍然是所传参数对象的构造器.这样造 ...
- golang bytes 包
类型 []byte 的切片十分常见,Go 语言有一个 bytes 包专门用来解决这种类型的操作方法. bytes 包和字符串包十分类似.而且它还包含一个十分有用的类型 Buffer: import & ...
- BZOJ 2850: 巧克力王国 KDtree + 估价函数
Code: #include<bits/stdc++.h> #define maxn 100000 #define inf 1000000008 #define mid ((l+r)> ...
- 【转载】使用IntelliJ IDEA 配置Maven(入门)
1. 下载Maven 官方地址:http://maven.apache.org/download.cgi 解压并新建一个本地仓库文件夹 2.配置本地仓库路径 3.配置maven环境变量 ...
- 强大而优雅,API 研发管理 EOLINKER 新版正式发布!
EOLINKER 于2019年3月3日正式发布新版本!该版本大幅强化各个产品的功能.着重优化了全站的用户交互体验,并且EOLINKER AMS 产品正式更名为 EOLINKER API Studio ...