1,node.js如何读取文件(异步和同布)
同步:
// 同步读取文件
var rs = require('fs');
var data = rs.readFileSync('test.js','utf-8');
console.log(data);
console.log('Read file end!');
// 输出符结果是 先内容 后end
异步:
var rs = require('fs');
rs.readFile('test.js','utf-8',function(err,data){
if(err){
console.log('you are wrong!');
}else{
console.log(data);
}
})
console.log('Read file end!');
输出的结果是:先end 后内容
总结:其实同步读取文件比较好理解,输出的顺序也正是你要的,只需要把文件名传给rs.readFileSync()函数即可,阻塞等待完成后就可以拿到数据;
2,工作目录:
我们使用__dirname来获取执行文件时该文件在文件系统中所在的位置;
不过,有的时候,我们需要获得程序在运行时的当前工作目录。
要想获得当前工作目录给可以使用process.cwd();
Node还提供了process.chdir();允许灵活的地更改工作目录;
3,环境变量
node允许通过process.env变量来轻松访问shell环境下单变量;
process.env.SHELL
5,ANSI转义码
/**
要在文本终端下控制格式,颜色以及其输出选项,可以使用ansi转义码
在文本周围添加到明显不用于输出到字符,称为非打印字符。
如下
console.log('\033[90m' + data.replace(/(.*)/g,' $1') + '\033[39m');
注释:
\033表示转义序列到开始。
[表示开始颜色设置
90表示前景色为亮灰色
m表示颜色设置结束;
*/
6,stream
fs.createReadStream 方法允许为一个文件创建一个可读到stream对象。
为了更好地理解stream,以下有个例子
fs.readFile('myfile.txt',function(err,contents){
// 对文件进行处理
})
上面这个例子,回调函数必须要等到整个文件读取完毕,载入到ram,可用的情况下才会触发;
而下面的这个例子,每次会读取可变大小的内容块,并且每次读取后会触发回调函数;
var stream = fs.createReadStream('myfile.txt');
stream.on('data',function(chunk){
// 处理文件部分内容
})
stream.on('end',function(chunk){
//文件读取完毕
})
7,watch监控
var fs = require('fs');
var stream = fs.createReadStream('myfile.js');
// 获取工作目录下所有文件
var files = fs.readdirSync(process.cwd());
files.forEach(function(file){
// 监听 .css 后缀的文件
if(/\.css/.test(file)){
fs.watchFile(process.cwd() + '/' + file,function(){
console.log('-' + file + 'changed!');
})
}
})
8,TCP
/***
TCP有哪些特性呢?
1,TCP的首要特性就是它是面向连接的;
面向连接的通信和保证顺序的传递
说到TCP,可以讲客户端和服务器端端通信看作是一个连接或者数据流。这种开发面向服务的应用和流应用是很好的抽象,
因为tcp协议做基于的ip协议是面向无连接的;
IP是基于数据报的传输。这些数据报是独立进行传输的,送达的顺序也是无序的。
2,面向子节
tcp对字符以及字符编码是完全无知的,不同的编码会导致传输的子节数不同。
tcp允许数据以ASCII字符或者unicode进行传输;
正是因为对消息格式没有严格的约束,使得tcp有很好的灵活性;
3,可靠性
由于tcp是基于底层不可靠的服务,因此,它必须要基于确认和超时实现一系列的机制来达到可靠性;
4,流控制
tcp会通过一种叫流控制的方式来确保两点之间传输数据的平衡;
5,拥堵控制
tcp有一种内置的机制能够控制数据包的延迟率以及丢包率不会太高,以此确保服务的质量;
*/
tcp net 连接
package.json
{
"name":"tcp-chat",
"description": "Our first TCP server",
"version": "0.0.1"
}
index.js
// demo2
var net = require('net');
// 创建服务器
var count = 0;
var server = net.createServer(function(conn){
conn.write(
'\n > welcome to \033[92mnode-chat\033[39m'
+ '\n > ' + count + 'other people are connected at this time.'
+ '\n > please write your name and press enter'
);
count++;
conn.on('close',function(){
count--;
})
})
// 监听
server.listen(3000,function(){
console.log('\033[90m server listening on *:3000\033[39m');
})
注意:打开至少两个cmd,一个启动服务,另外的就是指的客户端访问:telnet 127.0.0.1 3000 每打开一个cmd,连接tel,count就会+1,关闭一个则会-1;
9,data事件
本例是客户端的信息及时更新到服务端
// demo2
var net = require('net');
// 创建服务器
var count = 0;
var server = net.createServer(function(conn){
conn.write(
'\n > welcome to \033[92mnode-chat\033[39m'
+ '\n > ' + count + 'other people are connected at this time.'
+ '\n > please write your name and press enter'
);
count++;
conn.on('data',function(data){
console.log(data);
})
conn.on('close',function(){
count--;
})
conn.setEncoding('utf8');
})
// 监听
server.listen(3000,function(){
console.log('\033[90m server listening on *:3000\033[39m');
})
9,状态以及纪录连接情况
为了向其他的连接进来的客户端发送和广播消息,我们需要对该状态进行扩展,来追踪到底谁进来了。
当客户端输入昵称后,就认为该客户端已经连接成功,并可接受消息了!
// demo2
var net = require('net');
// 创建服务器
var count = 0,users = [];
var nickname; // 代表当前连接端昵称
var server = net.createServer(function(conn){
conn.write(
'\n > welcome to \033[92mnode-chat\033[39m'
+ '\n > ' + count + 'other people are connected at this time.'
+ '\n > please write your name and press enter'
);
count++;
conn.on('data',function(data){
console.log(data);
data = data.replace('\r\n','') // 删除回车键
if(!nickname){
if (users[data]) {
conn.write('\033[93m> nickname already in use.try agagin:\033[39m');
return;
} else {
nickname = data;
users[nickname] = conn;
for (var i in users) {
users[i].write('\033[90m > ' + nickname + 'joined the room \033[39m\n');
}
}
}
})
conn.on('close',function(){
count--;
})
conn.setEncoding('utf8');
})
// 监听
server.listen(3000,function(){
console.log('\033[90m server listening on *:3000\033[39m');
})