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

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. android 中的Context(一)

    context的功能如此强大,它是activity的父类. public abstract class Context { ... public abstract Object getSystemSe ...

  2. LDA PCA 学习笔记

    提要: 本文主要介绍了和推导了LDA和PCA,参考了这篇博客 LDA LDA的原理是,将带上标签的数据(点),通过投影的方法,投影到维度更低的空间中,使得投影后的点,会形成按类别区分,一簇一簇的情况, ...

  3. 题解报告:hdu 1142 A Walk Through the Forest

    题目链接:acm.hdu.edu.cn/showproblem.php?pid=1142 Problem Description Jimmy experiences a lot of stress a ...

  4. 【MySQL】二进制分发安装

    操作系统:Red Hat Enterprise Linux Server release 6.5 Mysql安装包:mysql-5.6.34-linux-glibc2.5-x86_64.tar.gz ...

  5. IOS7 APP 升级的10个TIP 建议

    There is no way to preserve the iOS 6 style status bar layout. The status bar will always overlap yo ...

  6. js中关于new Object时传参的一些细节分析

    1, 参数是一个对象,核心js对象(native ECMAScript object)或宿主对象(host object),那么将直接返回该对象. 其生成的对象构造器仍然是所传参数对象的构造器.这样造 ...

  7. golang bytes 包

    类型 []byte 的切片十分常见,Go 语言有一个 bytes 包专门用来解决这种类型的操作方法. bytes 包和字符串包十分类似.而且它还包含一个十分有用的类型 Buffer: import & ...

  8. BZOJ 2850: 巧克力王国 KDtree + 估价函数

    Code: #include<bits/stdc++.h> #define maxn 100000 #define inf 1000000008 #define mid ((l+r)> ...

  9. 【转载】使用IntelliJ IDEA 配置Maven(入门)

    1. 下载Maven 官方地址:http://maven.apache.org/download.cgi 解压并新建一个本地仓库文件夹 2.配置本地仓库路径   3.配置maven环境变量      ...

  10. 强大而优雅,API 研发管理 EOLINKER 新版正式发布!

    EOLINKER 于2019年3月3日正式发布新版本!该版本大幅强化各个产品的功能.着重优化了全站的用户交互体验,并且EOLINKER AMS 产品正式更名为 EOLINKER API Studio ...