- 创建服务器
var http = require('http');//导入模块
//request,response可以简写为req,res(喜欢也可以用其他代替,不过就是函数的参数名,乐意就好)
http.createServer(function (request, response) {
//writeHead该函数在一个请求内最多只能调用一次,如果不调用,则会自动生成一个响应头。
//状态码是一个三位数的 HTTP 状态码,如 404。 最后一个参数 headers 是响应头。 第二个参数 statusMessage 是可选的状态描述。
//该方法在消息中只能被调用一次,且必须在 response.end() 被调用之前调用。
// 发送 HTTP 头部
// HTTP 状态值: 200 : OK
// 内容类型: text/plain
response.writeHead(200, {
'Content-Type': 'text/plain'});
//.end就是当客户端来访问时,你返回给客户端的信息
// 发送响应数据 "Hello World"
response.end('Hello World\n');
}).listen(8888);//服务端监听的端口号,就是客户端通过哪个端口访问服务端
// 终端(服务端)打印如下信息(log:日志,也就是打印日志信息),
console.log('Server running at http://127.0.0.1:8888/');
运行演示:
2. 回调函数
var fs = require("fs");//提供了文件的读取、写入、更名、删除、遍历目录、链接等POSIX 文件系统操作。
//调用文件的地址,如果和该代码.js文件是同一目录下,可以不用加 ./ 但是建议养成好习惯
var data = fs.readFileSync('./hello.txt');//Sync:Synchronize
///进程的同步(Synchronize) 是指相互合作的进程之间需要交换一定的信息,
//当某进程未获得其合作进程发来的信息之前,该进程等待,直到 该信息到来时才被唤醒...
console.log(data.toString());//有任何一种语言基础,toString方法不难理解吧
console.log("阻塞程序执行结束!");
//可以看出readFile方法没有Sync后缀,说明他是不需要等待文件读取完成的,可以先执行后面的代码
fs.readFile('./hello.txt', function (err, data) {
if (err) return console.error(err);//如果运行错误就报错嘛
console.log(data.toString());
console.log("最后我就赢了");
});
console.log("非阻塞程序执行结束!");
运行演示
[root@localhost hello]# node hello.js
优快云地址:https://editor.csdn.net/md?not_checkout=1&articleId=108487045
阻塞程序执行结束!
非阻塞程序执行结束!
优快云地址:https://editor.csdn.net/md?not_checkout=1&articleId=108487045
最后我就赢了
3.事件循环+EventEmitter 类
// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
//emitter:发射区
var eventEmitter = new events.EventEmitter();
// 创建事件处理程序
var connectHandler = function connected() {
console.log('连接成功。');
// 触发 data_received 事件
eventEmitter.emit('data_received');
}
// 绑定 connection 事件处理程序,也就是监听器,只不过还有处理的能力
eventEmitter.on('connection', connectHandler);
// 使用匿名函数绑定 data_received 事件,如果不匿名也就只是将function(){...}改成 function buniming(){...}
eventEmitter.on('data_received', function(){
console.log('数据接收成功。');
});
// 触发 connection 事件
//然后就调用 connection 事件处理程序-----connectHandler
//然后就执行connect函数
//打印日志文件后,就触发了 data_received 事件
//然后就调用 data_received 事件处理程序
//打印日志文件
//程序执行完毕
eventEmitter.emit('connection');
console.log("程序1执行完毕。");
// 监听器 #1
var listener1 = function listener1() {
console.log('监听器 listener1 执行。');
}
// 监听器 #2
var listener2 = function listener2() {
console.log('监听器 listener2 执行。');
}
// 绑定 connection 事件,处理函数为 listener1
eventEmitter.addListener('connection', listener1);
// 绑定 connection 事件,处理函数为 listener2
eventEmitter.on('connection', listener2);
//还有程序1的监听器connectHandler,所以一共三个
var eventListeners = eventEmitter.listenerCount('connection');
console.log(eventListeners + " 个监听器监听连接事件。");
// 处理 connection 事件
eventEmitter.emit('connection');
// 移除监绑定的 listener1 函数
eventEmitter.removeListener('connection', listener1);
console.log("listener1 不再受监听。");
// 触发连接事件
eventEmitter.emit('connection');
eventListeners = eventEmitter.listenerCount('connection');
console.log(eventListeners + " 个监听器监听连接事件。");
console.log("程序2执行完毕。");
运行演示
D:\Nodejs\node.exe D:\test\hello\hello.js
连接成功。
数据接收成功。
程序1执行完毕。
3 个监听器监听连接事件。
连接成功。
数据接收成功。
监听器 listener1 执行。
监听器 listener2 执行。
listener1 不再受监听。
连接成功。
数据接收成功。
监听器 listener2 执行。
2 个监听器监听连接事件。
程序2执行完毕。
- Buffer(缓冲区)
Error: Cannot find module 'C:\Users\����\AppData\Local\Temp\debugConnector.191.8026.39.js'
因为utf8编码格式我写成了utf-8,js代码不是这样写的。
代码:
//JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。
//但在处理像TCP流或文件流时,必须使用到二进制数据。因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。
// ascii - 仅支持 7 位 ASCII 数据。如果设置去掉高位的话,这种编码是非常快的。。
// base64 - Base64 编码。
// hex - 将每个字节编码为两个十六进制字符。
const buf = Buffer.from('runoob', 'ascii');//以ascii的方式编码写入缓存
//输出 runoob
console.log(buf.toString('ascii'));//以ascii的方式解码
// 输出 72756e6f6f62
console.log(buf.toString('hex'));//以16进制的方式解码
// 输出 cnVub29i
console.log(buf.toString('base64'));
// 创建一个长度为 20、且用 0 填充的 Buffer。,默认格式UTF-8
const buf1 = Buffer.alloc(20);//alloc:allocate:分配
len = buf1.write("www.666.com");//将字符串写入buf1中(替代初始的0),返回值时字符串的长度,默认格式UTF-8
console.log("写入字节数 : "+ len);
console.log( buf.toString('utf8',0,20)); //后面两个数字代表输出缓冲区的索引start和end
//连接buf
var buffer0 = Buffer.concat([buf,buf1]);
console.log(buffer0.toString());
//比较缓冲区
console.log(buffer0.compare(buf));//输出1,buffer和buf比较,buf在buffer之前,所以返回1
console.log(buf.compare(buffer0));//输出-1,buf在buffer之前,所以返回-1
// 创建一个长度为 10、且用 0x1 填充的 Buffer。
const buf2 = Buffer.alloc(10, 1);
console.log( buf2.toString()); //输出乱码不懂
// 创建一个长度为 10、且未初始化的 Buffer。
// 这个方法比调用 Buffer.alloc() 更快,
// 但返回的 Buffer 实例可能包含旧数据,
// 因此需要使用 fill() 或 write() 重写。
const buf3 = Buffer.allocUnsafe(10);
console.log( buf3.toString('utf8'));
// 创建一个包含 [0x1, 0x2, 0x3] 的 Buffer。
const buf4 = Buffer.from([1, 2, 3]);
console.log( buf4.toString('utf8'));
// 创建一个包含 UTF-8 字节 [0x74, 0xc3, 0xa9, 0x73, 0x74] 的 Buffer。
const buf5 = Buffer.from('test');//默认编码格式,UTF-8
console.log(buf5.toString('utf8'));
// 创建一个包含 Latin-1 字节 [0x74, 0xe9, 0x73, 0x74] 的 Buffer。
const buf6 = Buffer.from('test', 'latin1');
console.log( buf6.toString('utf8'));
console.log( buf6.toString('latin1'));
//返回JSON对象
const buf7 = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]);
const json = JSON.stringify(buf7);//将JavaScript值转换为JSON字符串,当是Buffer实例时会隐式调用 toJSON()方法,将缓冲区里的数据改为json字符串
// 输出: {"type":"Buffer","data":[1,2,3,4,5]}
console.log(json);
//将标准的 JSON 格式其转换为 JavaScript 对象
const copy = JSON.parse(json, (key, value) => {
console.log(key);
console.log(value);
console.log(value.type);
console.log(value.data);
//key和value应该就是json中的键和值,我觉得value.type不可以用key代替
return value && value.type === 'Buffer' ? //条件表达式?表达式1:表达式2。说明:问号前面的位置是判断的条件,判断结果为bool型,为true时调用表达式1,为false时调用表达式2。
Buffer.from(value.data) :
value;//因为value.type都不是buffer类型所以都是 return value
});
// 输出: <Buffer 01 02 03 04 05>
console.log(copy);//都是json中的value
//拷贝缓存区
var buffer1 = Buffer.from('123456789');
var buffer2 = Buffer.from('abcd');
//将 buf2 插入到 buf1 指定位置上
buffer2.copy(buffer1,3);
console.log(buffer1.toString());
//裁剪
buffer1=buffer1.