原文摘自我的前端博客,欢迎大家来访问

http://www.hacke2.cn

之前负责过一个智能家居项目的开发,外包重庆一家公司的,我们主要开发服务器监控和集群版管理。

移动端和机顶盒的远程通信是用中间服务器完成交互,服务器使用MINA NIO框架,非阻塞式的,可以看看以前博客了解下某智能家居项目框架学习总结,或者其他资料JAVA NIO原理基于MINA框架快速开发网络应用程序

在移动端或者机顶盒登录后会使用spring security 进行加密,主要是结合用户名和密码来加密,生成一个唯一标示符。服务器来到一个请求时会检查对应的标示符来发送相关约定好的命令,如登录到移动端向服务器发送命名,服务器会生成如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;

每一个连接都有它的用户名和密码,也有它的client,也就是Socket。也有一个标示符,表示是主控还是客户端

然后添加一个原型方法,用来向当前client发送信息

下面就是编写主程序了,使用Node.js进行网络应用程序的开发很简单,详细大家能看懂

//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');
//使用用户名和密码进行加密,放入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对某智能家居服务器重构的更多相关文章

  1. 利用Node.js对某智能家居server重构

    原文摘自我的前端博客,欢迎大家来訪问 http://www.hacke2.cn 之前负责过一个智能家居项目的开发,外包重庆一家公司的.我们主要开发server监控和集群版管理. 移动端和机顶盒的远程通 ...

  2. 【Node.js】利用node.js搭建服务器并访问静态网页

    node.js是一门服务端的语言,下面讲讲如何利用node.js提供给我们的api来搭建服务器,并且访问静态网页 项目结构如下 ------------------------------------ ...

  3. 如何更好的利用Node.js的性能极限

    通过使用非阻塞.事件驱动的I/O操作,Node.js为构建和运行大规模网络应用及服务提供了很好的平台,也受到了广泛的欢迎.其主要特性表现为能够处理庞大的并且高吞吐量的并发连接,从而构建高性能.高扩展性 ...

  4. Fenix – 基于 Node.js 的桌面静态 Web 服务器

    Fenix 是一个提供给开发人员使用的简单的桌面静态 Web 服务器,基于 Node.js 开发.您可以同时在上面运行任意数量的项目,特别适合前端开发人员使用. 您可以通过免费的 Node.js 控制 ...

  5. node.js中net模块创建服务器和客户端(TCP)

    node.js中net模块创建服务器和客户端 1.node.js中net模块创建服务器(net.createServer) // 将net模块 引入进来 var net = require(" ...

  6. 用Node.js原生代码实现静态服务器

    ---恢复内容开始--- 后端中服务器类型有两种 1. web服务器[ 静态服务器 ] - 举例: wamp里面www目录 - 目的是为了展示页面内容 - 前端: nginx 2. 应用级服务器[ a ...

  7. 教你利用Node.js漏洞搞事情

    PentestingNode.js Application : Nodejs Application Security 原文地址:http://www.websecgeeks.com/2017/04/ ...

  8. 利用Node.js的Net模块实现一个命令行多人聊天室

    1.net模块基本API 要使用Node.js的net模块实现一个命令行聊天室,就必须先了解NET模块的API使用.NET模块API分为两大类:Server和Socket类.工厂方法. Server类 ...

  9. Node.js 教程 03 - 创建HTTP服务器

    前言: 如果我们使用PHP来编写后端的代码时,需要Apache 或者 Nginx 的HTTP 服务器,并配上 mod_php5 模块和php-cgi. 从这个角度看,整个"接收 HTTP 请 ...

随机推荐

  1. Restful api介绍

    网络应用程序,分为前端和后端两个部分.当前的发展趋势,就是前端设备层出不穷(手机.平板.桌面电脑.其他专用设备......). 因此,必须有一种统一的机制,方便不同的前端设备与后端进行通信.这导致AP ...

  2. Ajax请求接口加密研究(针对网页前端的接口安全加密机制研究)

    通常我们在h5前端调用后台接口时,一般是ajax,那么接口的安全成了一个问题. 这里可以肯定的说,前端调用的接口一定要验证! 然后剖析了微信网页版.京东网页版这些,也都是通过接口的形势绑定数据,所以在 ...

  3. Bzoj1497 [NOI2006]最大获利

    Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 4449  Solved: 2181 Description 新的技术正冲击着手机通讯市场,对于各大运营商来 ...

  4. dedecms /member/uploads_edit.php SQL Injection Vul

    catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 Dedecms 5.3版本下的member/uploads_edit.p ...

  5. Linux C/C++ Memory Leak Detection Tool

    目录 . 内存使用情况分析 . 内存泄漏(memory leak) . Valgrind使用 1. 内存使用情况分析 0x1: 系统总内存的分析 可以从proc目录下的meminfo文件了解到当前系统 ...

  6. Objective-C Runtime与黑客帝国

    Runtime的消息机制让我容易想起黑客帝国的Matrix.而OC语言,就像是架构在C语言真实世界上的Matrix世界,Runtime接管了这个虚拟世界到真实世界的承接. 在黑客帝国里,Matrix的 ...

  7. C#调用c++的dll报错:“尝试读取或写入受保护的内存。这通常指示其他内存已损坏“

    一:c++代码内部报错引起.可能是空指针或者其他. 二:需要从c#代码调试进入c++代码.可以吧c++的dll和pdb拷入工程项目的debug目录下面. 三:我发现的错误时在C++内部声明啦全局变量, ...

  8. JBoss AS7 快速配置

    作者:MinUnix  原文出处:http://www.minunix.com/2013/08/jboss-as7-01/  如需转载请注明出处! 文档下载:http://www.minunix.co ...

  9. CSS3-box-flex弹性盒布局

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  10. Linux防火墙:iptables禁IP与解封IP常用命令

    在Linux服务器被攻击的时候,有的时候会有几个主力IP.如果能拒绝掉这几个IP的攻击的话,会大大减轻服务器的压力,说不定服务器就能恢复正常了. 在Linux下封停IP,有封杀网段和封杀单个IP两种形 ...