协议参考:
网络协议:IP/UDP/TCP/HTTP/Websocket
初步研究node中的网络通信模块
1 TCP协议—net
参考:
// server.jsconst 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.jsconst 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);});


