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

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. 【poj2699】 The Maximum Number of Strong Kings

    http://poj.org/problem?id=2699 (题目链接) 题意 给出1张有向完全图.U->V表示U可以打败V并得一分.如果一个人的得分最高,或者他打败所有比自己得分高的人,那么 ...

  2. Python简介及环境部署

    Python的由来:         Python的创始人:Guido van Rossum Guido 在1989年12月时,寻找一门“课余”编程项目来打发圣诞节前后的时间.Guido决定为当时正构 ...

  3. oracle sqlplus 连接不正常

    场景描述:在开始--运行--输入SQLPLUS 登陆不了报警:“WINDOWS找不到文件‘SQLPLUS’. 原因分析:一般出现这种情况可能的原因: 1.文件名有问题 2.路径有问题 3.安装有问题 ...

  4. Uva1515 Pool construction

    Time Limit: 3000MS64bit IO Format: %lld & %llu 网络流 最小割 心生绝望,用了好久的网络流模板居然是错的. ↑居然之前还侥幸能过一堆(并不)题. ...

  5. 在Swift中使用JavaScript的方法和技巧

    本文作者Nate Cook是一位独立的Web及移动应用开发者,是继Mattt大神之后NSHipster的主要维护者,也是非常知名活跃的Swift博主,并且还是支持自动生成Swift在线文档的Swift ...

  6. EF-CodeFirst-2玩的嗨

    时间戳.复杂类型.GUID自增长 GUID自增长 GUID用于当主建那是好处多多,但是和int不同.EF不会自动识别第一个为类名+Id开头或int类型字段 去设置自增长.尴尬的GUID怎么玩呢.. D ...

  7. CSS 公共样式分享

    global.css | reset.css(格式化样式) common.css(公共组件样式) layout.css(当前页面样式) 清除全站所有页面的浏览器默认样式,保证在初始样式在所有浏览器下一 ...

  8. AngularJs ngCsp、ngFocus、ngBlur、ngForm

    ngCsp 处理CSP(上下文安全策略)的支持. 当开发如google浏览器的扩展时候这个就必须使用. CSP禁止应用程序使用eval和Function(string)生成的函数.如果我们需要兼容,我 ...

  9. python合并2个字典

    2种方式,update()和items()方式 In [14]: a Out[14]: {'a': 1, 'b': 2, 'c': 3} In [15]: c = {'d': 4} In [16]: ...

  10. Java synchronized指南

    在多线程程序中,同步修饰符用来控制对临界区代码的访问.其中一种方式是用synchronized关键字来保证代码的线程安全性.在Java中,synchronized修饰的代码块或方法不会被多个线程并发访 ...