协议参考:
网络协议:IP/UDP/TCP/HTTP/Websocket
初步研究node中的网络通信模块
1 TCP协议—net
参考:
// server.js
const net = require('net');
const HOST = '127.0.0.1';
const PORT = 3000;
// 创建一个 TCP 服务实例
const server = net.createServer();
// 监听端口
server.listen(PORT, HOST);
server.on('listening', () => {
console.log(`服务已开启在 ${HOST}:${PORT}`);
});
server.on('connection', socket => {
// data 事件就是读取数据
socket.on('data', buffer => {
const msg = buffer.toString();
console.log(msg);
// write 方法写入数据,发回给客户端
socket.write(Buffer.from('你好 ' + msg));
});
})
server.on('close', () => {
console.log('Server Close!');
});
server.on('error', err => {
if (err.code === 'EADDRINUSE') {
console.log('地址正被使用,重试中...');
setTimeout(() => {
server.close();
server.listen(PORT, HOST);
}, 1000);
} else {
console.error('服务器异常:', err);
}
});
// client.js
const net = require('net');
const client = net.createConnection({
host: '127.0.0.1',
port: 3000
});
client.on('connect', () => {
// 向服务器发送数据
client.write('Nodejs 技术栈');
})
client.on('data', buffer => {
console.log(buffer.toString());
});
// 例如监听一个未开启的端口就会报 ECONNREFUSED 错误
client.on('error', err => {
console.error('服务器异常:', err);
});
client.on('close', err => {
console.log('客户端链接断开!', err);
});
先启动server.js , 在启动client.js
client向server发送”Nodejs 技术栈” , server向client发送“你好 。。。。。”
wireShark 抓包如下:
ctrl+C 关闭client命令行
2 HTTP协议-http
2.5 重定向案例
3 UDP协议-dgram
4 DNS解析
NodeJS 中 DNS 查询的坑 & DNS cache 分析
4.1 依赖操作系统底层域名解析
这时候会依次走: 系统(OS)缓存 (host文件) —> 路由器缓存 —>ISP DNS 缓存(如中国电信)
const dns = require('dns');
dns.lookup('www.killerlei.site', (err, address, family) => {
console.log('地址: %j 地址族: IPv%s', address, family);
});
4.2 链接到 DNS 服务器执行域名解析
dns 模块中除 dns.lookup() 之外的所有函数,都会连接到实际 DNS 服务器以执行名称解析并始终使用网络执行 DNS 查询
const dns = require('dns');
dns.resolve('www.killerlei.site', (err, address, family) => {
console.log('地址: %j 地址族: IPv%s', address, family);
});