协议参考:
网络协议:IP/UDP/TCP/HTTP/Websocket
初步研究node中的网络通信模块

1 TCP协议—net

参考:

  1. // server.js
  2. const net = require('net');
  3. const HOST = '127.0.0.1';
  4. const PORT = 3000;
  5. // 创建一个 TCP 服务实例
  6. const server = net.createServer();
  7. // 监听端口
  8. server.listen(PORT, HOST);
  9. server.on('listening', () => {
  10. console.log(`服务已开启在 ${HOST}:${PORT}`);
  11. });
  12. server.on('connection', socket => {
  13. // data 事件就是读取数据
  14. socket.on('data', buffer => {
  15. const msg = buffer.toString();
  16. console.log(msg);
  17. // write 方法写入数据,发回给客户端
  18. socket.write(Buffer.from('你好 ' + msg));
  19. });
  20. })
  21. server.on('close', () => {
  22. console.log('Server Close!');
  23. });
  24. server.on('error', err => {
  25. if (err.code === 'EADDRINUSE') {
  26. console.log('地址正被使用,重试中...');
  27. setTimeout(() => {
  28. server.close();
  29. server.listen(PORT, HOST);
  30. }, 1000);
  31. } else {
  32. console.error('服务器异常:', err);
  33. }
  34. });
  1. // client.js
  2. const net = require('net');
  3. const client = net.createConnection({
  4. host: '127.0.0.1',
  5. port: 3000
  6. });
  7. client.on('connect', () => {
  8. // 向服务器发送数据
  9. client.write('Nodejs 技术栈');
  10. })
  11. client.on('data', buffer => {
  12. console.log(buffer.toString());
  13. });
  14. // 例如监听一个未开启的端口就会报 ECONNREFUSED 错误
  15. client.on('error', err => {
  16. console.error('服务器异常:', err);
  17. });
  18. client.on('close', err => {
  19. console.log('客户端链接断开!', err);
  20. });

先启动server.js , 在启动client.js
image.png
client向server发送”Nodejs 技术栈” , server向client发送“你好 。。。。。”
wireShark 抓包如下:
image.png
ctrl+C 关闭client命令行
image.png

2 HTTP协议-http

2.5 重定向案例

语雀内容

3 UDP协议-dgram

4 DNS解析

NodeJS 中 DNS 查询的坑 & DNS cache 分析

分两种:

4.1 依赖操作系统底层域名解析

这时候会依次走: 系统(OS)缓存 (host文件) —> 路由器缓存 —>ISP DNS 缓存(如中国电信)

  1. const dns = require('dns');
  2. dns.lookup('www.killerlei.site', (err, address, family) => {
  3. console.log('地址: %j 地址族: IPv%s', address, family);
  4. });

image.png
修改host文件
image.png
重新运行
image.png

4.2 链接到 DNS 服务器执行域名解析

dns 模块中除 dns.lookup() 之外的所有函数,都会连接到实际 DNS 服务器以执行名称解析并始终使用网络执行 DNS 查询

  1. const dns = require('dns');
  2. dns.resolve('www.killerlei.site', (err, address, family) => {
  3. console.log('地址: %j 地址族: IPv%s', address, family);
  4. });

不受本地缓存影响
image.png

4.3 相关案例

语雀内容