搜尋
首頁web前端js教程一文聊聊Node中的net模組

一文聊聊Node中的net模組

Feb 09, 2023 pm 08:00 PM
node.jsnodenet模組

Node.js中提供了net模組,該模組提供了對TCP、Socket的封裝與支援。這篇文章就來帶大家來了解Node中的net模組,希望對大家有幫助!

一文聊聊Node中的net模組

我之前看教程的時候,很多都是從IO、buffer、path、event、fs、process、node 事件循環機制開始說起的.這些確實是node 開發主要依賴的開發依賴. 但是我比較著急, 從了解到node,就是說node 可以乾後端的話,但是這些課程前半截都在說它擁有的能力,就是最後才到如何和客戶端通訊的模組介紹.

我很難受,所以在我自己寫總結的時候,一定要寫先服務端和客戶端通訊的模組才舒服.即便過程中涉及到了event 模組、fs 模組的知識點,可以暫時擱置,只從整體來理解net模組如何實現通信的.

1. OSI 七層協定模型

想要學明白通訊模組,就不得不了解網路通訊模型,想要記住網路通訊模型,就不得不實際操作來輔助記憶. 這個是面試的重點. 這塊內容很多,想要跟深入的了解,還說需要體系的學習的. 這裡只是簡單提提。 【相關教學推薦:nodejs影片教學程式設計教學

#寄出這張老圖:

一文聊聊Node中的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 協定過程中使用到的協定族的統稱.

而客戶端和服務端的傳輸流如下

一文聊聊Node中的net模組

如果角色變成發送者接受者的時候,傳輸流如下圖:

一文聊聊Node中的net模組

可以看出來傳輸的過程中,從發送端開始,沒經過一層協議都會加上所需要的首部信息.層層把關,層層加碼. 然後到了接收端的時候, 就反而行之, 每經過一層都剝去對應的首部. 只等到最後拿到的HTTP 數據.

#上面圖片出自《圖解HTTP》

上面就是大體的網路協定模型.

疑惑: 為什麼書上和很多地方在把OSI 體系結果中合併成TCP/IP 五層協定之後,網路層的名稱會變成網路層呢?

2. TCP 連線

一文聊聊Node中的net模組

第一次握手: 客戶端傳送SYN 標誌位元給服務端(序號是J), 並且進入SYN_SENT 狀態(等待服務端確認狀態)

第二次握手: 服務端收到來自客戶端的SYN J, 服務端會確認該資料包已收到並發送ACK 標誌位(序號是J 1)和SYN 標誌位(序號是K), 隨後進入SYN_REVD 狀態(請求接受並等待客戶端確認狀態)

第三次握手: 客戶端進入連線建立狀態後,向服務端發送ACK標誌位元(K 1) , 確認客戶端已收到建立連線,伺服器收到ACK 標誌後,服務端進入連線已建立狀態.

J 和K 都是為了確立是誰在請求. SYN 和ACK 的結構沒有什麼不同,只是發送的物件不一樣.

3. net 模組

##net模組就是對於上面TCP 連線的具體實作.

首先, 學習API 依舊推薦直接進入官方文檔. 其中中文文檔內容不會是最新版本的

##在學習的時候,能夠有時間看英文文檔就盡量看英文文檔. 對於這一點我堅持了半年. 從一開始看不下去,直到現在能夠可以忍住不舒適感看下去. 半年時間進步就很明顯了. 而且這種不舒適感是一件好事,說明這個不是你的舒適區,畢竟勇於跨過自己的舒適區才是進步的源泉

接下來,進行正題.既然要學習通信,那麼我們就需要兩個物件來模擬客戶端和服務端.分別建立

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

自行查看列印的結果.

整個TCP 連接的框架大體就已經完成了. 當然實際的生產遠遠不止這些. 還要處理粘包、拆包/數據包, 心跳包等等.

本文轉載自:https://juejin.cn/post/7084618854801866765

作者:我是小橘子哦

更多node相關知識,請造訪:

nodejs 教學

以上是一文聊聊Node中的net模組的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:掘金社区。如有侵權,請聯絡admin@php.cn刪除
超越瀏覽器:現實世界中的JavaScript超越瀏覽器:現實世界中的JavaScriptApr 12, 2025 am 12:06 AM

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

使用Next.js(後端集成)構建多租戶SaaS應用程序使用Next.js(後端集成)構建多租戶SaaS應用程序Apr 11, 2025 am 08:23 AM

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

如何使用Next.js(前端集成)構建多租戶SaaS應用程序如何使用Next.js(前端集成)構建多租戶SaaS應用程序Apr 11, 2025 am 08:22 AM

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

JavaScript:探索網絡語言的多功能性JavaScript:探索網絡語言的多功能性Apr 11, 2025 am 12:01 AM

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

JavaScript的演變:當前的趨勢和未來前景JavaScript的演變:當前的趨勢和未來前景Apr 10, 2025 am 09:33 AM

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

神秘的JavaScript:它的作用以及為什麼重要神秘的JavaScript:它的作用以及為什麼重要Apr 09, 2025 am 12:07 AM

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

Python還是JavaScript更好?Python還是JavaScript更好?Apr 06, 2025 am 12:14 AM

Python更适合数据科学和机器学习,JavaScript更适合前端和全栈开发。1.Python以简洁语法和丰富库生态著称,适用于数据分析和Web开发。2.JavaScript是前端开发核心,Node.js支持服务器端编程,适用于全栈开发。

如何安裝JavaScript?如何安裝JavaScript?Apr 05, 2025 am 12:16 AM

JavaScript不需要安裝,因為它已內置於現代瀏覽器中。你只需文本編輯器和瀏覽器即可開始使用。 1)在瀏覽器環境中,通過標籤嵌入HTML文件中運行。 2)在Node.js環境中,下載並安裝Node.js後,通過命令行運行JavaScript文件。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境