使用 Nodejs net module 撰寫 TCP server

Search for a command to run...

No comments yet. Be the first to comment.
簡介 本文將會介紹兩大要點 資料在網路傳輸時,其底層資料傳輸概念 Nodejs 開發者該關注的部份有哪些 Network Layer 前一篇 基礎 Network 概念與 Nodejs http module範例 簡介了網路基礎的架構 以下就網路資料傳輸時的資料傳輸格式做個基礎簡介 由網路架構所知到,網路資料需要從電腦資料依序透過 Switch 接著 Router 到電纜等等不同設施間傳遞。 而為了方便傳輸,因此大致上規範出以下幾個標準作為網路資料分層 每個層集傳輸的資料單位與內容資訊不同 ...
書本連結 前言 會挑這本書看的人,應該都是關心自己負責專案的軟體架構的人。不只希望開發的軟體能滿足客戶的明確需求,也希望能滿足可維護性(maintainability)的隱性需求,以及自己對結構與美觀習慣的要求。 要能滿足上述這些要求很難,因為專案通常不會按照計畫進行。可能變因有 deadline,最後的 API 與承諾的不同,又或者我們的設計無法很好的貼合需求的變化所需。。因此完美的架構只有在一

我們的 AIOps agent 有個很具體的問題:它會捏造 trace ID。 當 on-call 工程師問「payment service 有沒有 error trace?」,agent 有時會信心滿滿地回答「是的,見 trace a1b2c3d4...」——但這串 ID 根本不存在 Tempo 裡。工程師點進去,404。壞的不只是使用者體驗,而是這讓整個 RCA 結論失去可信度。 另一個問題是

o11y-bench 深入剖析:讓 AI 真正面對 on-call 現場 從任務設計、合成環境、Agent 架構、評分機制到報告輸出,逐一解析這個開放 benchmark 的每個組件——以及 Gemini 3 Flash Preview 的完整實測結果 先說清楚這在解決什麼問題 目前多數 LLM benchmark 測的是「知識」:模型知不知道 PromQL 的語法,知不知道什麼是 p99

臥龍神算奇術完全兵書:從兵法原理到實戰,徹底搞懂奇術機制

稟告主公:此乃司馬懿進呈之兵書,詳解如何以 OpenTelemetry 陣法,令臥龍神算之一舉一動盡在掌握,知糧草消耗、察兵器效能、辨戰報異常,使主公運籌帷幄於大帳之中。 為何需要斥候情報? 司馬懿稟告主公: 臥龍神算(Claude Code)乃當世利器,然若無斥候回報,主公便如蒙眼行軍——兵器耗損幾何、糧草消費幾許、哪路斥候出了差錯,一概不知。臣以為,此乃兵家大忌。 無情報之弊,有四: 軍

本文將會講述以下重點
如何使用 nodejs 撰寫 tcp 的伺服器
透過 wireshark 等工具驗證傳輸的 Data 內容
為了能夠有效展示透過 Nodejs 撰寫 TCP server 的傳輸資料流程
以下將透過撰寫兩個程式來做邏輯驗證
simple-tcp-app.ts: 接收資料用的 TCP server
simple-sender.ts: 傳輸資料用的 TCP client
net module 是 Nodejs 用來處理網路傳輸的最底層處理模組
可以用來處理底從封包資料的傳送
在其之上還有比較網路應用的處理模組比如 http, https module 等等
這邊使用 net module 來做 tcp 這種比較底層資料格式資料的處理
這邊主要使用 tcp server 來接收 tcp client 所傳入的資料並且顯示在 server console 上
實作邏輯如下:
透過 net module 建立一個 TCP server
設定服務阜口為 3099 ,並且設定監聽資料事件與啟動事件
import * as net from 'net';
const port = 3099;
const server = net.createServer((socket) => {
socket.on('data', (data) => {
console.log(data);
});
});
server.listen(port, '127.0.0.1', () => {
console.log('opened server on', server.address());
});
這邊 tcp client 主要就是傳輸資料給 tcp server
因為 TCP 傳輸主要是透過 binary 資料傳輸
因此會使用 Buffer 來做資料轉換
實作邏輯如下:
透過 net module 建立一個 TCP client 連線到服務阜口為 3099的服務
設定連線後執行傳輸動作
import * as net from 'net';
const socket = net.createConnection({
host: '127.0.0.1',
port: 3099
}, () => {
const buffer = Buffer.alloc(8);
buffer[0] = 12;
buffer[1] = 34;
socket.write(buffer);
});
測試步驟:
啟動 server

啟動 client 執行接收

檢查 server 接收 log

開啟 wireshark 檢查資料 loopback interface 封包如下

故意把傳輸 size 改小再度驗證
import * as net from 'net';
const socket = net.createConnection({
host: '127.0.0.1',
port: 3099
}, () => {
const buffer = Buffer.alloc(2);
buffer[0] = 12;
buffer[1] = 34;
socket.write(buffer);
});
故意把傳輸 size 改小再度驗證 oopback interface 封包如下

[1]:net module [2]:http module [3]:https module