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

http://www.hacke2.cn

之前负责过一个智能家居项目的开发,外包重庆一家公司的。我们主要开发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重构的更多相关文章

  1. 利用Node.js对某智能家居服务器重构

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

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

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

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

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

  4. Node.js 从零开发 web server博客项目[express重构博客项目]

    web server博客项目 Node.js 从零开发 web server博客项目[项目介绍] Node.js 从零开发 web server博客项目[接口] Node.js 从零开发 web se ...

  5. Node.js 从零开发 web server博客项目[数据存储]

    web server博客项目 Node.js 从零开发 web server博客项目[项目介绍] Node.js 从零开发 web server博客项目[接口] Node.js 从零开发 web se ...

  6. Node.js 从零开发 web server博客项目[koa2重构博客项目]

    web server博客项目 Node.js 从零开发 web server博客项目[项目介绍] Node.js 从零开发 web server博客项目[接口] Node.js 从零开发 web se ...

  7. Node.js 从零开发 web server博客项目[安全]

    web server博客项目 Node.js 从零开发 web server博客项目[项目介绍] Node.js 从零开发 web server博客项目[接口] Node.js 从零开发 web se ...

  8. Node.js 从零开发 web server博客项目[日志]

    web server博客项目 Node.js 从零开发 web server博客项目[项目介绍] Node.js 从零开发 web server博客项目[接口] Node.js 从零开发 web se ...

  9. Node.js 从零开发 web server博客项目[登录]

    web server博客项目 Node.js 从零开发 web server博客项目[项目介绍] Node.js 从零开发 web server博客项目[接口] Node.js 从零开发 web se ...

随机推荐

  1. 【BZOJ4025】二分图(可撤销并查集+线段树分治)

    题目: BZOJ4025 分析: 定理:一个图是二分图的充要条件是不存在奇环. 先考虑一个弱化的问题:保证所有边出现的时间段不会交叉,只会包含或相离. 还是不会?再考虑一个更弱化的问题:边只会出现不会 ...

  2. [转]通过Net Manager 配置Oracle 11g本地监听服务(listener service)

    本文转自:http://blog.csdn.net/mozart_cai/article/details/8596504 [Target] 通过ip address 监听orcl服务,而不是通过loc ...

  3. NHibernate系列学习(三)-条件查询Criteria

    1.本笔记主要介绍Criteria的使用 2.效果界面 3.代码详情 namespace KimismeDemo { public partial class Form3 : Form { priva ...

  4. JS——筋斗云案例

    需求: 1.鼠标移动到哪里,云彩移动到哪里 2.鼠标离开,云彩回到原点 3.鼠标离开,云彩回到之前点击的地方 <!DOCTYPE html> <html lang="en& ...

  5. Matrix computations in C

    meschach配置使用 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !im ...

  6. vue命令行创建运行工程

    // install vue-cli 安装依赖包 npm install --g vue-cli// 使用vue-cli初始化项目 vue init webpack my-project// inst ...

  7. 使用原生JS的AJAX读取json全过程

    首先ajax(async javascript and xml)是用于前端与后端文件比如xml或者json之间的交互.他是一种异步加载技术,意味着你点击某个加载事件是再也不用刷新整个页面,而是发送局部 ...

  8. todey

    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/> 框架集fromset ...

  9. linq 升序排序 空值放后面并根据另一个字段进行多重排序

    List<PickingInfo> res = GetDatas(); var _d = (from e in res select new { aa = e.pickingLibrary ...

  10. sqlalchemy子查询

    使用subquery() 要使用c来定位上一个子句的属性 s1 = session.query(m.a,m.b).filter().subquery() s2 = session.query(s1.c ...