Heim >Web-Frontend >js-Tutorial >Eine eingehende Analyse des Netzmoduls in Nodejs
Dieser Artikel führt Sie durch das Netzmodul in Node, ich hoffe, er wird Ihnen hilfreich sein!
Dies ist der erste Artikel in der Nodejs-Reihe. Viele davon begannen mit den IO-, Puffer-, Pfad-, Ereignis-, FS-, Prozess- und Knotenereignisschleifenmechanismen In der Tat hängt die Entwicklung von Knoten hauptsächlich von der Entwicklungsabhängigkeit ab. Seit ich etwas über Knoten erfahren habe, bedeutet dies, dass der Knoten das Backend übernehmen kann, aber in der ersten Hälfte dieser Kurse geht es nur um die Fähigkeiten, die er hat ist, wie man am Ende mit dem Client interagiert.
Ich fühle mich sehr unwohl. Wenn ich also meine eigene Zusammenfassung schreibe, muss ich zuerst das Modul schreiben, das zwischen dem Server und dem Client kommuniziert, um mich wohl zu fühlen Auch wenn die Wissenspunkte des Event-Moduls und des FS-Moduls in den Prozess involviert sind, können Sie es vorerst beiseite legen und einfach verstehen, wie das net
-Modul die Kommunikation als Ganzes implementiert net
模块如何实现通信的.
想要学明白通信模块,就不得不了解网络通信模型,想要记住网络通信模型,就不得不实际操作来辅助记忆. 这个是面试的重点. 这一块内容很多,想要跟深入的了解,还说需要体系的学习的. 这里只是简单提提.
寄出这张老图:
对于我们前端而言, 需要记住 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 协议过程中使用到的协议族的统称.
而客户端和服务端的传输流如下
如果角色变成发送者
和接受者
的时候,传输流如下图:
可以看出来传输的过程中,从发送端开始,没经过一层协议都会加上所需要的首部信息.层层把关,层层加码. 然后到了接收端的时候, 就反而行之, 每经过一层都剥去对应的首部. 只等到最后拿到的 HTTP 数据.
上面图片出自《图解 HTTP》
上面就是大体的网络协议模型.
疑惑: 为什么书上和很多地方在把 OSI 体系结果中合并成 TCP/IP 五层协议之后,网络层的名称会变成网际层呢?
第一次握手: 客户端向服务端发送 SYN 标志位(序号是 J), 并进入 SYN_SENT 状态(等待服务端确认状态)
第二次握手: 服务端收到来自客户端的 SYN J, 服务端会确认该数据包已收到并发送 ACK 标志位(序号是 J + 1)和 SYN 标志位(序号是 K), 随后进入 SYN_REVD 状态(请求接受并等待客户端确认状态)
第三次握手: 客户端进入连接建立状态后,向服务端发送 ACK 标志位(K+ 1) , 确认客户端已收到建立连接,服务器收到 ACK 标志后,服务端进入连接已建立状态.
J 和 K 都是为了确立是谁在请求. SYN 和 ACK 的结构没有什么不同,只是发送的对象不一样.
net模块
ICMP
, einem Protokoll, das an das IP-Protokoll angehängt ist, können wir erkennen, dass für Netzwerkprotokolle keine Notwendigkeit besteht ICMP
erfordert offensichtlich das IP-Protokoll als Basis, aber es ist auch als Netzwerkschicht geplant. Um ein korrektes Verständnis des OSI-Modells zu haben, sollten wir das OSI-Modell verwenden Probleme lösen. Analyse ist aussagekräftiger als die sogenannte Schichtung von Protokollen 🎜🎜TCP/IP-Protokollcluster bezieht sich nicht nur auf TCP- und IP-Protokolle, sondern weil diese beiden Protokolle auch außerhalb des Kreises liegen, TCP/ Unter IP versteht man zusammenfassend die Sammlung von Protokollen im Zusammenhang mit dem Internet. Anders ausgedrückt: die Sammelbezeichnung für die Protokollfamilie, die bei der Verwendung des TCP/IP-Protokolls verwendet wird.🎜🎜Die Übertragung Der Fluss zwischen dem Client und dem Server ist wie folgt 🎜🎜🎜🎜Wenn die Rollen
Sender
und Receiver
werden, ist der Übertragungsablauf wie folgt: 🎜🎜🎜🎜Es ist ersichtlich, dass während des Übertragungsprozesses ab Auf der Sendeseite wird alles hinzugefügt, ohne eine Protokollschicht zu durchlaufen. Die erforderlichen Header-Informationen werden Schicht für Schicht überprüft und Schicht für Schicht codiert. Auf der Empfangsseite wird dann das Gegenteil durchgeführt und der entsprechende Header anschließend abgezogen Warten Sie einfach, bis die endgültigen HTTP-Daten vorliegen An vielen Stellen werden die Ergebnisse des OSI-Systems in das fünfschichtige TCP/IP-Protokoll und die Netzwerkschicht integriert. Wird der Name zur Internetschicht?🎜🎜 blockquote>3. net module
🎜net module
Es ist die spezifische Implementierung der oben genannten TCP-Verbindung. 🎜Zuallererst wird beim Erlernen der API immer noch empfohlen, direkt zur offiziellen Dokumentation zu gehen. Der Chinesische DokumentationInhalt wird nicht die neueste Version sein
Wenn Sie lernen, versuchen Sie, die englische Dokumentation zu lesen, wenn Sie möchten Ich habe ein halbes Jahr lang daran festgehalten, aber jetzt kann ich das Unbehagen ertragen und nach einem halben Jahr weitermachen Das ist gut, denn das ist nicht deine Komfortzone. Denn der Mut, die eigene Komfortzone zu überschreiten, ist die Quelle des Fortschritts.
Als nächstes kommen wir zur Sache. Da wir Kommunikation lernen wollen, brauchen wir zwei Objekte, um den Client und den Server zu simulieren. Erstellen Sie zwei Dateien mit
client.js
:client.js
和service.js
两个文件. 通过命令行创建:touch client.js && touch service.js3.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.js
和client.js
node service.js node client.js3.1 service.js-Teil
Führen Sie das Modulnet
ein, lassen Sie den Server in den StatusLISTENT
wechseln und konfigurieren Sie es Geben Sie die Portnummer und die HOST-Adresse ein (überspringen Sie den DNS-Auflösungsprozess manuell) und warten Sie auf den Anruf des Clientsrrreee
Zu diesem Zeitpunkt entspricht der Server dem ServerstatusLISTEN
in der TCP-Verbindung. Dann werden einige notwendige Ereignisse überwacht, bei denen es sich um die vom Server bereitgestellten Hooks handelt. (Gehört zum ereignisbezogenen Wissen) : Ereignis, das nach dem Abhören des Ports ausgelöst wirdVerbindung
: Wird ausgelöst, wenn ein Client zu Besuch kommt. EreignisSchließen
: Wird durch Herunterfahren des Servers ausgelösterror
: Ausgelöst durch ServerfehlerFürcloseWas wir beachten müssen ist, dass der Hintergrundbruder normalerweise direkt istrrreeerrreee
beendet den ThreadInconnection
Gouzi ist der formale Parameter die Socket-Benennung. Die chinesische Übersetzung ist ein verschachteltes Wort, das grob als die gesendeten Daten verstanden werden kann Dies liegt daran, dass die Daten selbst eine eigene Methode zur Verarbeitung vonsocket
haben.stream wird in zukünftigen Artikeln vorgestellt.
🎜Da der Server die vom Client gesendeten Daten akzeptieren kann, kann er diese natürlich auch an den Client senden. Schreiben Sie insocket.on
(natürlich kann es auch außerhalb geschrieben werden): 🎜rrree 🎜Wenn der Client zu diesem Zeitpunkt die Annahme der Daten abgeschlossen und dann die Verbindung geschlossen hat, können wir auch densocket.on('close')
-Hook abhören: 🎜rrreee🎜Die Zusammenfassung der Dassocket
-Ereignis wird inclient.js
eingefügt. Derzeit sind alle Inhalte vonservice.js
wie folgt: 🎜rrreee3.2 client.js-Teil h3>🎜Client's Es ist viel einfacher.🎜rrreee🎜Eine Zusammenfassung der
socket
-Ereignisse🎜🎜
connect
: Wird durch eine erfolgreiche Verbindung zum Server ausgelöstdata
: Vom Server gesendete Parameter empfangenend
: Kann nach Abschluss des Datenempfangs ausgelöst werden- close: Socket-Close-Trigger
service.js
- undclient.js
-Frameworks wurden geschrieben und werden ausgeführt in zwei Terminals: 🎜rrree🎜Überprüfen Sie die gedruckten Ergebnisse.🎜🎜Das gesamte TCP-Verbindungsgerüst ist natürlich weit mehr als das. Wir müssen uns auch um das Auspacken und Verpacken von Sticky-Paketen kümmern , Heartbeat-Pakete usw.🎜🎜🎜 Dieser Artikel wurde reproduziert von: https://juejin.cn/post/7084618854801866765🎜🎜Autor: I am Little Orange🎜🎜🎜Weitere Informationen zu Knoten finden Sie unter: 🎜nodejs-Tutorial 🎜! 🎜
Das obige ist der detaillierte Inhalt vonEine eingehende Analyse des Netzmoduls in Nodejs. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!