Maison  >  Article  >  interface Web  >  Un article pour parler du module net dans Node

Un article pour parler du module net dans Node

青灯夜游
青灯夜游avant
2023-02-09 20:00:232322parcourir

Node.js fournit le module net, qui assure l'encapsulation et la prise en charge de TCP et Socket. Cet article vous présentera le module net dans Node. J'espère qu'il vous sera utile !

Un article pour parler du module net dans Node

Quand j'ai regardé des tutoriels auparavant, beaucoup d'entre eux partaient d'IO, de tampon, de chemin, d'événement, de fs, de processus, de mécanisme de boucle d'événement de nœud. Ce sont en effet les dépendances de développement sur lesquelles repose principalement le développement de nœuds. assez anxieux. À partir du moment où j'ai entendu parler de Node, cela signifie que Node peut être utilisé comme back-end, mais la première moitié de ces cours portait uniquement sur ses capacités, et seule l'introduction du module sur la façon de communiquer avec le client l'était. introduit à la fin.

Je me sentais très mal à l'aise, donc quand j'écris mon propre résumé, je dois d'abord écrire le module qui communique entre le serveur et le client même si les points de connaissance du module event et du module fs sont impliqués. le processus, je peux le mettre de côté pour le moment et ne comprendre que le dans son ensemble. Comment le module net implémente la communication.net模块如何实现通信的.

1. OSI 七层协议模型

想要学明白通信模块,就不得不了解网络通信模型,想要记住网络通信模型,就不得不实际操作来辅助记忆. 这个是面试的重点. 这一块内容很多,想要跟深入的了解,还说需要体系的学习的. 这里只是简单提提。【相关教程推荐:nodejs视频教程编程教学

寄出这张老图:

Un article pour parler du module net dans Node

对于我们前端而言, 需要记住 TCP/IP 协议簇的体系结果既可.

  • 应用层: http(80 端口)、FTP(21)、SMTP(发送邮件)、POP(接收邮件)、DNS

  • 传输层: TCP/ UDP

  • 网际层: IP,ICMP(是 IP 层的附属协议)

  • 数据链路层: PPP, SLIP

  • 物理层: 网有双绞线、同轴电缆、光纤等传输方式, 遵循 ISO2110 规范

ICMP这种依附于 IP 协议的协议可以知道,对于网络协议的分层不用过于较劲. ICMP明明需要 IP 协议为基础,但是它也被规划为网络层. 我们对于 OSI 模型的正确的认识,我认为应该是用 OSI 模型来进行问题的分析比用来对于协议进行所谓的分层更加来得有意义.

TCP/IP 协议簇 并不是只是指 TCP 和 IP 协议,只是因为这两个协议过于出圈,所以就用 TCP/IP 来统称互联网相关联的协议集合起来. 还有另外一种说法是,在使用 TCP/IP 协议过程中使用到的协议族的统称.

而客户端和服务端的传输流如下

Un article pour parler du module net dans Node

如果角色变成发送者接受者的时候,传输流如下图:

Un article pour parler du module net dans Node

可以看出来传输的过程中,从发送端开始,没经过一层协议都会加上所需要的首部信息.层层把关,层层加码. 然后到了接收端的时候, 就反而行之, 每经过一层都剥去对应的首部. 只等到最后拿到的 HTTP 数据.

上面图片出自《图解 HTTP》

上面就是大体的网络协议模型.

疑惑: 为什么书上和很多地方在把 OSI 体系结果中合并成 TCP/IP 五层协议之后,网络层的名称会变成网际层呢?

2. TCP 连接

Un article pour parler du module net dans Node

第一次握手: 客户端向服务端发送 SYN 标志位(序号是 J), 并进入 SYN_SENT 状态(等待服务端确认状态)

第二次握手: 服务端收到来自客户端的 SYN J, 服务端会确认该数据包已收到并发送 ACK 标志位(序号是 J + 1)和 SYN 标志位(序号是 K), 随后进入 SYN_REVD 状态(请求接受并等待客户端确认状态)

第三次握手: 客户端进入连接建立状态后,向服务端发送 ACK 标志位(K+ 1) , 确认客户端已收到建立连接,服务器收到 ACK 标志后,服务端进入连接已建立状态.

J 和 K 都是为了确立是谁在请求. SYN 和 ACK 的结构没有什么不同,只是发送的对象不一样.

3. net 模块

net模块

1. Modèle de protocole OSI à sept couches

Si vous souhaitez en savoir plus sur le module de communication, vous devez comprendre le modèle de communication réseau. Si vous souhaitez vous souvenir du modèle de communication réseau, vous devez vous entraîner. C'est l'objet de l'entretien. Il y a beaucoup de contenu dans ce domaine. Si vous souhaitez avoir une compréhension approfondie, cela nécessite également un apprentissage systématique. [Tutoriels associés recommandés : tutoriel vidéo nodejs, Enseignement de la programmation]🎜🎜Envoyez cette ancienne photo :🎜🎜Un article pour parler du module net dans Node🎜🎜Pour notre front-end, nous devons nous souvenir des résultats système de la suite de protocoles TCP/IP.🎜
    🎜Couche application : http (port 80), FTP (21), SMTP (envoi d'e-mail), POP (réception d'e-mail), DNS🎜
  • 🎜Couche de transport : TCP/UDP🎜
  • 🎜Couche Internet : IP, ICMP (un protocole subsidiaire de la couche IP)🎜
  • 🎜Couche liaison de données : PPP, SLIP🎜
  • 🎜Couche physique : réseau Paire torsadée , le câble coaxial, la fibre optique et d'autres méthodes de transmission suivent la spécification ISO2110🎜
🎜De ICMP, un protocole attaché au protocole IP, nous pouvons savoir que pour le réseau protocoles Il n'est pas nécessaire d'être trop exigeant en matière de layering. ICMP nécessite évidemment le protocole IP comme base, mais il est également prévu comme couche réseau. Pour bien comprendre le modèle OSI, je. Je pense que nous devrions utiliser le modèle OSI pour résoudre les problèmes. L'analyse est plus significative que ce qu'on appelle la superposition de protocoles 🎜
🎜Le cluster de protocoles TCP/IP ne fait pas seulement référence aux protocoles TCP et IP, mais parce que ces deux protocoles le sont. trop hors du cercle, TCP/IP est utilisé IP collectivement fait référence à l'ensemble des protocoles liés à Internet. Il existe une autre façon de le dire, le nom collectif de la famille de protocoles utilisée dans l'utilisation du protocole TCP/IP. 🎜
🎜Le flux de transmission entre le client et le serveur est le suivant 🎜🎜Un article pour parler du module net dans Node🎜🎜Si le rôle devient Expéditeur Lors de la communication avec Récepteur, le flux de transmission est le suivant : 🎜🎜Un article pour parler du module net dans Node🎜🎜On peut voir que pendant le processus de transmission, à partir de l'extrémité d'envoi, les informations d'en-tête requises seront ajoutées sans passer par un couche de protocole. Couches de vérifications et couches de codage. Ensuite, en ce qui concerne la réception, cela fonctionnera au contraire, décollez l'en-tête correspondant après chaque couche. Attendez simplement que les données HTTP finales soient obtenues. blockquote>🎜L'image ci-dessus provient de "Illustrated HTTP"🎜🎜Ce ci-dessus est le modèle général de protocole réseau.🎜🎜Doutes : Pourquoi le nom de la couche réseau devient-il la couche Internet après la fusion des résultats du système OSI dans le protocole TCP/IP à cinq couches dans les livres et dans de nombreux endroits ?🎜

2. Connexion TCP

🎜Un article pour parler du module net dans Node🎜🎜Première Première prise de contact : le client envoie le bit d'indicateur SYN (le numéro de séquence est J) au serveur, et entre dans l'état SYN_SENT (en attente de confirmation du serveur) 🎜🎜Deuxième poignée de main : le serveur reçoit le SYN J du client et le serveur confirmera que le paquet de données a été reçu et a envoyé le bit du drapeau ACK (le numéro de séquence est J + 1) et le bit d'indicateur SYN (le numéro de séquence est K), puis entre dans l'état SYN_REVD (demande d'acceptation et attente de l'état de confirmation du client) 🎜🎜Troisième poignée de main : Client Une fois que le client entre dans l'état de connexion établie, il envoie le bit d'indicateur ACK (K+ 1) au serveur pour confirmer que le client a reçu la connexion établie. Une fois que le serveur a reçu l'indicateur ACK, le serveur entre dans l'état de connexion établie 🎜
🎜J et K sont tous pour établir qui demande. Il n'y a pas de différence dans la structure de SYN et ACK, mais les objets envoyés sont différents.🎜

3. >🎜net module est l'implémentation spécifique de la connexion TCP ci-dessus.🎜

Tout d'abord, lors de l'apprentissage de l'API, il est toujours recommandé d'aller directement à la documentation officielle. Le contenu de la documentation chinoisene sera pas la dernière version

Lors de l'apprentissage, essayez de lire la documentation en anglais si vous. J'ai le temps. Sur ce point, j'ai persisté pendant six mois. Depuis le début, je ne pouvais pas le supporter, mais maintenant je peux supporter l'inconfort et continuer à regarder. Les progrès ont été évidents en six mois. une bonne chose, ça veut dire que ce n'est pas ta zone de confort. Après tout, le courage de traverser sa zone de confort est source de progrès

Ensuite, entrons dans le vif du sujet. Puisqu'on veut apprendre la communication, il nous en faut deux. objets pour simuler le client et le serveur. Établissez respectivement client.js et service.js Créé via la ligne de commande : client.jsservice.js两个文件. 通过命令行创建:

touch client.js && touch service.js

3.1 service.js 部分

引入net模块,并让服务器进入LISTENT状态, 以及配置端口号和 HOST 地址(手动略过 DNS 解析过程), 等待客户端的召唤

const net = require("net");
const post = 3306;
const host = "127.0.0.1";

const server = net.createServer();
server.listen(post, host);

此时服务器对应了 TCP 连接中服务器LISTEN状态.

随后监听一些必要的事件,也就是 server 提供的钩子. (属于 event 相关知识)

server.on("listening", () => {
  console.log("服务器已经可以连接啦");
});

server.on("connection", (socket) => {
  console.log("有客户端来访咯");
});

server.on("close", () => {
  console.log("服务器关闭了");
});

server.on("error", (error) => {
  console.log("服务器出错啦: ", error); // error 有错误的信息
});

上面这一串代码涉及到了,

  • listening: 监听端口后出发的事件
  • connection: 有客户端来访的时候触发事件
  • close: 服务器关闭触发
  • error: 服务器出错触发

对于close我们需要注意的是,后台大哥一般是直接

ps
kill -9 pid

通过杀死线程的方式来进行的

connection狗子中, 形参是 socket 命名. 它的中文翻译为嵌套字, 被 node 封装成了 stream(流).在可以粗浅的理解为就是客户端发送过来的数据. 这是这个数据自身是有方法的. 我在connection中对socket来进行处理

server.on("connection", (socket) => {
  console.log("有客户端来访咯");

  socket.on("data", (data) => {
    console.log(data); // 客户端发送过来的数据
  });
});

stream 以后的文章会进行介绍.

服务端既然能够接受客户端发过来的数据,自然也能够给客户端回复. 在socket.on中写入(当然也可以写在外面):

socket.write("我已经收到你的服务器了哦,客户端");

此时如果客户端已经完成了数据的接受,然后关闭了连接.我们可以也可以通过socket.on('close‘)钩子监听到:

socket.on("close", () => {
  console.log("客户端把另外一头的流给关了");
});

对于socket事件的总结放入client.js中. 此时service.js的所有内容如下:

const net = require("net");
const post = 3306;
const host = "127.0.0.1";

const server = net.createServer();
server.listen(post, host);

server.on("listening", () => {
  console.log("服务器已经可以连接啦");
});

server.on("connection", (socket) => {
  console.log("有客户端来访咯");

  socket.on("data", (data) => {
    console.log(data); // 客户端发送过来的数据

    socket.write("我已经收到你的服务器了哦,客户端");
  });

  socket.on("close", () => {
    console.log("客户端把另外一头的流给关了");
    server.close(); // 客户端已经不要数据了,那么我们就把服务器给关闭了吧
  });
});

server.on("close", () => {
  console.log("服务器关闭了");
});

server.on("error", (error) => {
  console.log("服务器出错啦: ", error); // error 有错误的信息
});

3.2 client.js 部分

客户端的就简单很多.

const net = require("net");
const post = 3306;
const host = "127.0.0.1";

const socket = net.connect(post, host);

socket.on("connect", () => {
  console.log("已经连接到服务器了哦");
});

socket.write("服务器, 我来了");
socket.on("data", (data) => {
  console.log(data.toString());
  socket.end();
});

socket.on("close", () => {
  console.log("连接已关闭了");
});

对于socket的事件的总结

  • connect: 成功和服务器连接触发
  • data: 接受到服务器发过来的参数
  • end: 数据接收完毕之后可以触发
  • close: socket 关闭触发

service.jsclient.js

node service.js
node client.js

Partie service.js 3.1

Introduisez le module net, laissez le serveur entrer dans l'état LISTENT, configurez le numéro de port et l'adresse HOST (ignorez manuellement le processus de résolution DNS) et attendez l'appel du client

rrreee

À ce moment, le serveur correspond à l'état LISTEN du serveur dans la connexion TCP.

Ensuite, il surveille certains événements nécessaires, qui sont les hooks fournis par le serveur. (Appartient aux connaissances liées aux événements)
rrreee

Celui ci-dessus Le code de chaîne implique,

  • écoute : événement déclenché après l'écoute du port
  • connexion : déclenché lorsqu'un client visite Événement
  • close : déclenché par l'arrêt du serveur
  • erreur : Déclenché par une erreur du serveur

PourfermerCe que nous devons noter, c'est que le frère d'arrière-plan est généralement directement

rrreee
tue le fil

Dans connexionGouzi, le paramètre formel est le nom du socket . Sa traduction chinoise est un mot imbriqué, qui est encapsulé dans le flux par nœud. Il peut être grossièrement compris comme les données envoyées. par le client. C'est parce que les données elles-mêmes ont leur propre méthode. Je suis en connexion pour traiter le socketrrreee

🎜le flux sera introduit dans les prochains articles.🎜🎜 🎜Puisque le serveur peut accepter les données envoyées par le client, il peut naturellement aussi les envoyer au client Répondre. Écrivez dans socket.on (bien sûr, cela peut aussi être écrit à l'extérieur) : 🎜rrreee. 🎜A ce moment, si le client a fini d'accepter les données puis fermé la connexion. Nous pouvons également passer Le hook socket.on('close') écoute : 🎜rrreee🎜Le résumé du L'événement socket est placé dans client.js. À l'heure actuelle, tout le contenu de service.js est le suivant : 🎜rrreee

Partie client.js 3.2 h3>🎜Client C'est beaucoup plus simple.🎜rrreee🎜Un résumé des événements socket🎜
  • connect : déclenché par une connexion réussie au serveur
  • data : recevoir les paramètres envoyés depuis le serveur
  • end : peut être déclenché une fois la réception des données terminée
  • close : les frameworks de déclenchement de fermeture de socket
🎜service.js et client.js ont été écrits et ils sont exécutés dans deux terminaux : 🎜rrreee🎜Vérifiez vous-même les résultats imprimés.🎜🎜L'ensemble du cadre de connexion TCP est à peu près terminé. Bien sûr, la production réelle est bien plus que cela. Nous devons également nous occuper des paquets collants, du déballage/de l'emballage. , paquets de battements de cœur, etc.🎜🎜🎜 Cet article est reproduit à partir de : https://juejin.cn/post/7084618854801866765🎜🎜Auteur : Je suis Little Orange🎜🎜🎜Pour plus de connaissances sur les nœuds, veuillez visiter : 🎜Tutoriel Nodejs 🎜! 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer